gpt4 book ai didi

java - jsp 中出现 NullPointerException,但控制台中没有出现 NullPointerException

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:06 26 4
gpt4 key购买 nike

RecupData 我的类仅在 web 中返回 NullPointerException。我连接到 pgsql db 8.3.7 - 该脚本在“控制台”syso 中运行良好 - 但引发了测试 Web NullPointerException

下面是抛出异常的方法:

/**
*
*/
package com.servlet.pgsql;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
*
*/
public class RecupData {

/**
* Connection connection
*/

static String SqlSinRef = "SELECT * FROM \"SINref\""; // view in pgsql - contain only 1 column
static Connection connection;
static Statement statement;



/**
* cette méthode sert pour toutes les connections de la classe RecupData
*/
public static Statement state() {

try{
connection = UniqueConnection.getInstance();
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
}
catch(Exception e) { e.printStackTrace(); }

return statement;
}


public static String htmlListeRefDossier() {

ResultSet resultat;

String listeHtml = "<form>\n" +
"\t<select>\n";

try {
resultat = state().executeQuery(SqlSinRef);
while(resultat.next()) {
listeHtml = listeHtml+"\t\t<option>"+resultat.getString(1)+"</option>\n"; }
}
catch (SQLException e) {
listeHtml = listeHtml+"sql exception sortie";
e.printStackTrace();
}
catch (NullPointerException e) {
listeHtml = listeHtml+"null pointer exception -sortie";
e.printStackTrace();
}


listeHtml = listeHtml+"\t</select>\n</form>";
return listeHtml;

}


/*
* valable just pour le dev
* method main only for test in console
*/
public static void main(String[] args) throws SQLException {

System.out.println(htmlListeRefDossier());

}
/*
* A SUPPRIMER
*/

} // fin class

这是唯一连接:

public class UniqueConnection {

private volatile static Connection connect;

public static Connection getInstance(){

if(connect == null){
synchronized(Connection.class){
try { connect = DriverManager.getConnection(url, user, passwd); }
catch(SQLException e) { e.printStackTrace(); }
}
}
return connect;
}

}

你能看一下吗?谢谢!

最佳答案

看这里:

public static Statement state() {

try{
connection = UniqueConnection.getInstance();
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
}
catch(Exception e) { e.printStackTrace(); }

return statement;
}

你的异常处理很差。如果 UniqueConnection.getInstance()connection.createStatement() 抛出异常,则代码将立即跳转到 catch block ,从而不影响 statement 变量,从而保持 null。由于您只是将堆栈跟踪打印到标准输出并继续代码流,而不是抛出完全值得的异常,因此代码继续进入 return statements 行。由于 statement 仍为 null,因此每当您尝试对返回值调用方法时,您都会收到 NullPointerException

resultat = state().executeQuery(SqlSinRef); // state() returns null, so NPE!

您需要阅读 catch 子句中打印的堆栈跟踪来查找问题的真正原因,而不是由 NPE 引起的原因。或者更好的是,抛出一个真正的异常,以便代码立即停止,而不是继续流程并使用可能为 null 的变量。

修复所有 catch 子句,这些子句只是吞掉异常并打印跟踪以引发真正的异常:

catch(SomeException e) { throw e; }

或者,更好的是,只需删除它们并在方法声明中使用throws子句。仅当您能够以合理方式处理异常时(即采用替代路径、向最终用户显示错误屏幕并中止代码等;仅打印跟踪并继续使用null变量绝对不是正确的替代路径),或者当您希望使用finally block 来关闭和释放昂贵的资源时,您才应该使用try block 。

我敢打赌,它实际上SQLException:没有合适的驱动程序,因为驱动程序加载失败并出现ClassNotFoundException org.postgresql.Driver,并且您以相同的方式抑制了此异常。

<小时/>

与问题无关:您的代码存在更严重的问题。

  • 您已将连接、语句和结果集等昂贵的数据库资源声明为类的静态变量。这不是线程安全的!它在使用它们一次然后立即关闭的应用程序中可以正常工作。但在运行期间多次使用它们的应用程序(例如 Web 应用程序)中,它会严重失败。

  • 不想在网络应用程序的整个生命周期中使用“唯一连接”。一般数据库只要打开时间过长就会自动关闭。您需要在尽可能短的范围内获取并关闭连接、语句和结果集。如果您想提高连接性能,则应该使用连接池。

  • 您的数据访问层与表示层极其紧密地耦合。您正在数据库访问类中而不是在 JSP 文件中构建一些 HTML 片段。

相应地修复它。您可以在以下问题的答案中找到一些启动示例:

关于java - jsp 中出现 NullPointerException,但控制台中没有出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6787972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com