2
gave this error when trying to run a class
error Sef.module13.activity.Accountdaoexception: Exception occcured while finding Account via ID
that’s the class
package sef.module13.activity;
// Complete Code
public class AccountDAOException extends Exception{
private static final long serialVersionUID = -2397012533045245997L;
public static final String ERROR_FIND_ID="Exception occcured while finding Account via ID";
public static final String ERROR_FIND_NAME="Exception occcured while finding Account via Name";
public static final String ERROR_INSERT_ACCOUNT="Exception occured while inserting new Account";
public AccountDAOException(String message, Throwable cause){
super(message, cause);
}
}
was while trying to run this class
package sef.module13.activity;
//Needs to be completed
public class AccountDAOClient {
public static void main(String[] args) {
AccountDAO obj = new AccountDAOImpl();
try {
obj.findAccount("John");
// Test1 - Type code to test findAccount("1")
obj.findAccount("Jane", "Doe");
// Test2 - Type code to test findAccount("J","D"). How many records
// do you get?
// Test3 - Type code to test
// insertAccount("6","Sasha","Kohli","[email protected]",90000)
obj.insertAccount("6", "Sasha", "Kohli", "[email protected]",90000);
// Test4 - Type code to test deposit("1",2000)
obj.deposit("1", 2000);
// Test5 - Type code to test deposit("2",3000)
obj.deposit("2", 3000);
// Test6 - Type code to test deleteAccount("6")
} catch (Exception e) {
System.out.println("erro " + e);
}
}
}
any suggestions?
I use the following interface
package sef.module13.activity;
// Complete Code
import java.util.List;
public interface AccountDAO {
/**
* Returns a list of accounts that with first names and last names that contain
* the specified first name and last name. The result list will be ordered via ID
* in an ascending manner
*
* @param firstName the first name of the account to search
* @param lastName the last name of the account to search
* @return list of accounts that match the criteria
*
* @throws AccountDAOException when a problem occurs during search
*/
public List findAccount(String firstName, String lastName) throws AccountDAOException;
public Account findAccount(String id) throws AccountDAOException;
public boolean insertAccount(String id, String firstName, String lastName, String email, float balance ) throws AccountDAOException;
public boolean deposit(String id, float amount ) throws AccountDAOException;
public boolean withdraw(String id, float amount ) throws AccountDAOException;
public boolean deleteAccount(String id) throws AccountDAOException;
}
they are being implemented here the methods
package sef.module13.activity;
//Needs to be completed
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
public class AccountDAOImpl implements AccountDAO {
private Connection conn;
public AccountDAOImpl() {
String url = "jdbc:mysql://localhost/activity";
String user = "root";
String pass = "123";
try{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "impossível carregar o Driver.");
System.exit(0);
}
try {
Connection cn = DriverManager.getConnection(url, user, pass);
this.conn = cn;
conn.setAutoCommit(false);
} catch (SQLException sqle) {
JOptionPane.showMessageDialog(null, "Problema ao conectar!");
System.exit(0);
}
// String url = "jdbc:mysql://localhost/activity";
// String user = "root";
// String pass = "123";
//
//
//
// try {
// // 1 - Load the driver
//
// // 2 - Obtain a connection using DriverManager class
// Connection cn = DriverManager.getConnection(url, user, pass);
// this.conn = cn;
// conn.setAutoCommit(false);
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
// 3 - implement findAccount method which returns a list of accounts
// matching the first name and last name combination
public List findAccount(String firstName, String lastName)
throws AccountDAOException {
List<Account> results = new ArrayList<Account>();
try {
PreparedStatement pStmt = conn.prepareStatement("'select first_name from accout where first_name like ?'");
pStmt.setString(1, '%' + firstName.toUpperCase() + '%');
pStmt.setString(2, '%' + lastName.toUpperCase() + '%');
ResultSet rs = pStmt.executeQuery();
while (rs.next()) {
results.add(new AccountImpl(rs.getString(1), rs.getString(2),
rs.getString(3), rs.getString(4), rs.getFloat(5)));
}
} catch (SQLException e) {
throw new AccountDAOException(AccountDAOException.ERROR_FIND_NAME,
e);
}
return results;
}
// 4 - Complete implementation for findAccount method
public Account findAccount(String id) throws AccountDAOException {
try {
PreparedStatement pStmt = conn.prepareStatement("");
pStmt.setString(1, id);
ResultSet rs = pStmt.executeQuery();
if (rs.next()) {
return new AccountImpl(rs.getString(1), rs.getString(2),
rs.getString(3), rs.getString(4), rs.getFloat(5));
}
} catch (SQLException e) {
throw new AccountDAOException(AccountDAOException.ERROR_FIND_ID, e);
}
return null;
}
// 5 - Complete implementation for insertAccount
public boolean insertAccount(String id, String firstName, String lastName,
String email, float balance) throws AccountDAOException {
return false;
}
// 6 - Complete implementation for deposit. It should ensure that the
// account balance is increased by the amount deposited.
public boolean deposit(String id, float amount) throws AccountDAOException {
return false;
}
// 7 - Complete implementation for withdraw. It should ensure that the
// account balance is reduced by the amount deposited.
public boolean withdraw(String id, float amount) throws AccountDAOException {
return false;
}
// 8 - Complete implementation for deleteAccount
public boolean deleteAccount(String id) throws AccountDAOException {
return false;
}
}
following the suggestion
I altered and put this line of code
try {
obj.findAccount("John");
// Test1 - Type code to test findAccount("1")
obj.findAccount("Jane", "Doe");
// Test2 - Type code to test findAccount("J","D"). How many records
// do you get?
// Test3 - Type code to test
// insertAccount("6","Sasha","Kohli","[email protected]",90000)
obj.insertAccount("6", "Sasha", "Kohli", "[email protected]",90000);
// Test4 - Type code to test deposit("1",2000)
obj.deposit("1", 2000);
// Test5 - Type code to test deposit("2",3000)
obj.deposit("2", 3000);
// Test6 - Type code to test deleteAccount("6")
} catch (Exception e) {
e.printStackTrace();/*essa linha >>>>>>>>>>>>>>*/
}
then he made that mistake
Sef.module13.activity.Accountdaoexception: Exception occcured while finding Account via ID at Sef.module13.activity.Accountdaoimpl.findAccount(Accountdaoimpl.java:110) at Sef.module13.activity.Accountdaoclient.main(Accountdaoclient.java:13) Caused by: java.sql.Sqlexception: Parameter index out of range (1 > number of Parameters, which is 0). at com.mysql.jdbc.SQLError.createSQLException(Sqlerror.java:1094) at com.mysql.jdbc.SQLError.createSQLException(Sqlerror.java:997) at com.mysql.jdbc.SQLError.createSQLException(Sqlerror.java:983) at com.mysql.jdbc.SQLError.createSQLException(Sqlerror.java:928) com.mysql.jdbc.PreparedStatement.checkBounds(Preparedstatement.java:3688) at com.mysql.jdbc.PreparedStatement.setInternal(Preparedstatement.java:3670) at com.mysql.jdbc.PreparedStatement.setString(Preparedstatement.java:4491) at Sef.module13.activity.Accountdaoimpl.findAccount(Accountdaoimpl.java:102) ... 1 more
which indicated those lines
Accountdaoimpl.java:110)
public Account findAccount(String id) throws AccountDAOException {
try {
PreparedStatement pStmt = conn.prepareStatement("'select first_name from accout where first_name like ?'");
pStmt.setString(1, id);
ResultSet rs = pStmt.executeQuery();
if (rs.next()) {
return new AccountImpl(rs.getString(1), rs.getString(2),
rs.getString(3), rs.getString(4), rs.getFloat(5));
}
} catch (SQLException e) {
throw new AccountDAOException(AccountDAOException.ERROR_FIND_ID, e);/*é essa linha>>>>>>>>>>>>>>>>>>>>>*/
}
return null;
}
that Accountdaoclient.java:13 line)
try {
obj.findAccount("John");/*essa linha>>>>>>>>>>>>>>>>>> */
// Test1 - Type code to test findAccount("1")
obj.findAccount("Jane", "Doe");
// Test2 - Type code to test findAccount("J","D"). How many records
// do you get?
// Test3 - Type code to test
// insertAccount("6","Sasha","Kohli","[email protected]",90000)
obj.insertAccount("6", "Sasha", "Kohli", "[email protected]",90000);
// Test4 - Type code to test deposit("1",2000)
obj.deposit("1", 2000);
// Test5 - Type code to test deposit("2",3000)
obj.deposit("2", 3000);
// Test6 - Type code to test deleteAccount("6")
} catch (Exception e) {
e.printStackTrace();
}
that line (Accountdaoimpl.java:102)
public Account findAccount(String id) throws AccountDAOException {
try {
PreparedStatement pStmt = conn.prepareStatement("'select first_name from accout where first_name like ?'");
pStmt.setString(1, id);/*essa linha>>>>>>>>>>>>>>>>>>>>>*/
ResultSet rs = pStmt.executeQuery();
if (rs.next()) {
return new AccountImpl(rs.getString(1), rs.getString(2),
rs.getString(3), rs.getString(4), rs.getFloat(5));
}
} catch (SQLException e) {
throw new AccountDAOException(AccountDAOException.ERROR_FIND_ID, e);
}
return null;
}
Instead of showing only the last line of the exception -
System.out.println("erro " + e);
- show exception entire -e.printStackTrace();
- otherwise it will be impossible to know what it is. Also, "mask" one exception in another (creating aAccountDAOException
where the "real" exception - theSQLException
- was relegated to "caused by") is a bad practice. Please do this, and post the complete exception, with all lines (chiefly the part that says "caused by...").– mgibsonbr
I put the changes can help me now?
– wladyband
Try to remove the simple quotation marks from your sql query. I’m not sure if this causes the error, but I know they are not necessary.
– Math
By the way, forget... After your editing everything I was writing lost its meaning... I suggest you read that related question, besides my suggestion above (i.e. not to mask one exception in the other). When to your mistake, most likely it is just that - the presence of quotation marks inside the quotation marks (the Prepared statement should be considering everything as a string, and so does not recognize that the query receives a parameter; when you try to pass the parameter, it complains of
Parameter index out of range
).– mgibsonbr
worked out thanks :)
– wladyband