我以外的其他机器上的空指针异常[重复]

Posted

技术标签:

【中文标题】我以外的其他机器上的空指针异常[重复]【英文标题】:Null pointer exception on other machines other than Mine [duplicate] 【发布时间】:2016-12-02 19:47:03 【问题描述】:

我正在 Eclipse 中编写一个 Java Swing 应用程序。我已经导出为可运行的 jar。当我运行它时。一切正常。所以我已经将相同的 JAR 发送到我的第二台机器。当我运行它时,令我惊讶的是,这是一个null pointer Exception

下面是我的一段代码。

try 
       String dburl = path.getDBUrl();

       System.out.println(dburl);

       textArea.append(dburl + "\n");
       System.out.println(path.getSystemId + " s id \n");
       textArea.append(path.getSystemId + "\n");

       // connect to Excel
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
       Connection myConn = DriverManager.getConnection(dburl);
       String queryString = "select sum(Pages) as totalUnitsCount,sum(TotalErrors) as totalError, Sum(IIF(Type Like 'Formatting Error ',(TotalErrors),0)) as FormsattingCount, Sum(IIF([Type] like 'X Ref Error ',(TotalErrors),0)) as [X ref CountErrs]," + "Sum(IIF(((Type Like 'Formatting Error ' and Critical<>0)),(Critical),0)) as FormsattingErrorCritical," + "Sum(IIF(((Type Like 'X Ref Error ' and Critical<>0)),(Critical),0)) as XRefErrorCritical," + "Count(IIF(((Type Like 'Formatting Error ' and NonCritical<>0)),1,null)) as FormsattingErrorNonCritical," + "Count(IIF(((Type Like 'X Ref Error ' and NonCritical<>0)),1,null)) as XRefErrorNonCritical" + "  from [Quality Sheet$]";

       statement = myConn.prepareStatement(queryString);
       resultSet = statement.executeQuery();
       ResultSetMetaData rsMetaData = resultSet.getMetaData();
       System.out.println(rsMetaData.getColumnCount());
   

这在我的机器上运行良好,但在我的第二台机器上它在下面的行中抛出异常。

    Connection myConn = DriverManager.getConnection(dburl);

这是我的 SetTheExcelPath 文件

public class SetTheExcelSrcPath 
    String getSystemId = System.getProperty("user.name");

    public String getDBUrl() 
        return "jdbc:odbc:Driver=Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb);DBQ=C:\\Users\\" + getSystemId
                + "\\Desktop\\Quality Sheets\\quality_template.xlsx;";
    


请让我知道我哪里出了问题以及我该如何解决这个问题。

这里我的机器上没有出现异常,它被抛出到另一台机器上,如果问题出在我的机器上,我会调试的。

这是我的堆栈跟踪

 java.lang.NullPointerException at
 sun.jdbc.odbc.JdbcOdbcDriver.initialize(JdbcOdbcDriver.java: 453) at
 sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java: 153) at
 java.sql.DriverManager.getConnection(Unknown Source) at
 java.sql.DriverManager.getConnection(Unknown Source) at
 Src.Files.TestExcel. < init > (TestExcel.java: 39) at
 Src.Files.ReportsGeneratorGUI$3.actionPerformed(ReportsGeneratorGUI.java: 91)
 at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at
 javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at
 javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at
 javax.swing.DefaultButtonModel.setPressed(Unknown Source) at
 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at
 javax.swing.JComponent.processMouseEvent(Unknown Source) at
 java.awt.Component.processEvent(Unknown Source) at
 java.awt.Container.processEvent(Unknown Source) at
 java.awt.Component.dispatchEventImpl(Unknown Source) at
 java.awt.Container.dispatchEventImpl(Unknown Source) at
 java.awt.Component.dispatchEvent(Unknown Source) at
 java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at
 java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at
 java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at
 java.awt.Container.dispatchEventImpl(Unknown Source) at
 java.awt.Window.dispatchEventImpl(Unknown Source) at
 java.awt.Component.dispatchEvent(Unknown Source) at
 java.awt.EventQueue.dispatchEventImpl(Unknown Source) at
 java.awt.EventQueue.access$500(Unknown Source) at
 java.awt.EventQueue$3.run(Unknown Source) at
 java.awt.EventQueue$3.run(Unknown Source) at
 java.security.AccessController.doPrivileged(Native Method) at
 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at
 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at
 java.awt.EventQueue$4.run(Unknown Source) at
 java.security.AccessController.doPrivileged(Native Method) at
 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at
 java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at
 java.awt.EventDispatchThread.run(Unknown Source)

为了调试,我在文件中添加了以下代码。

try 
    try 
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
     catch (InstantiationException | IllegalAccessException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
 catch (ClassNotFoundException e) 
    textArea.append("Where is your Oracle JDBC Driver?\n");
    e.printStackTrace();
    return;

textArea.append("JDBC ODBC Driver Registered!\n");

Connection myConn;
try 
    myConn = DriverManager.getConnection(dburl, "", "");
 catch (SQLException e) 
    textArea.append("Connection Failed! Check output console\n");
    e.printStackTrace();
    return;


if (myConn != null) 
    textArea.append("You made it, take control your database now!\n");
 else 
    textArea.append("Failed to make connection!\n");

当我在我的机器上运行它时,我得到了

JDBC ODBC 驱动程序已注册!你成功了,控制你的数据库 现在!

当我在第二台机器上做同样的事情时,它给出了

已注册 JDBC ODBC 驱动程序!

但不返回连接状态。我哪里错了?

谢谢

【问题讨论】:

如果它告诉您确切的行,则无需调试。 嗨@KevinEsche,不,这不是。问题是,当我在另一个系统上执行此操作时。但在我的系统中,它运行良好 @KevinEsche,它说问题出在DriverManager.getConnection(XX) 行,这非常令人困惑 @KevinEsche,当我执行sysout 时,显示的字符串正是所需的路径。 见What is a stack trace, and how can I use it to debug my application errors? & What is a Null Pointer Exception, and how do I fix it? 【参考方案1】:

可以找到驱动类,否则他会抛出ClassNotFoundException。他尝试初始化JdbcOdbcDriver,并在initialize() 的第453 行抛出NullPointerException。我想这是一个配置问题。也许他使用了一些配置文件进行 JDBC 初始化,而不是您认为的。

很遗憾,我的机器上没有 sun.jdbc.odbc.JdbcOdbcDriver 类,否则我可以查找第 453 行。

提示:在代码中放置大量日志记录行,然后在另一台机器上打开日志记录并观察他尝试使用哪些参数来初始化 JDBC。

【讨论】:

嗨@Keski,这是文件if (OdbcApi.getTracer().isTracing()) OdbcApi.getTracer().trace("Unable to load JdbcOdbc library"); 的第453行中的内容@ @Keski,你能告诉我如何做日志记录吗? 最简单的方法是:System.out.println("x=");一种更复杂的方法是使用著名的日志记录工具之一,例如 Log4J 或 JUL (= java.util.logging)。 嗯 - 在这一行的某处他遇到了 null。据我判断,这只能是表达式'OdbcApi.getTracer()'。所以 OdbcApi 不能返回正确的 Tracer 对象。可能是配置问题?在您的机器上,进入方法“getTracer()”并尝试找出,在这种情况下会返回 null。【参考方案2】:

您可能没有在第二台机器上设置驱动程序,它正在抛出NullPointerException,因为它无法加载驱动程序。

【讨论】:

如何设置驱动?,我将所有内容打包并导出为runnable jar 可能你使用的库有问题,检查一下你的项目是否有库错误。 在 Eclipse 中,在导出之前? 是的,在Eclipse中,右击你的项目->构建路径->配置构建路径并检查库中是否有错误。 我的库中没有错误我的朋友:(【参考方案3】:

我看到您正在使用指向您的数据库的 quality_template.xlsx 的 Excel 驱动程序。该文件不在您的其他计算机上,或者 dburl 的路径不正确。

public String getDBUrl() 
    return "jdbc:odbc:Driver=Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb);DBQ=C:\\Users\\" + getSystemId
            + "\\Desktop\\Quality Sheets\\quality_template.xlsx;";

您在获取 DBurl 时使用日志检查生成的路径或在此处设置断点。

【讨论】:

sysout of dburl 给了我准确的路径和文件。 :( 我的日志输出与问题中给出的异常相同

以上是关于我以外的其他机器上的空指针异常[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于登录Android Studio的实时firebase数据库上的空指针异常[重复]

操作栏中的空指针异常[重复]

获取地图上的空指针异常

OnGridImageSelectedListener.onGridImageSelected 上的空指针异常

服务类Spring引导中的空指针异常[重复]

getGraphics() 上的空指针异常