主要的奇怪的NullPointer异常

时间:2013-05-14 18:08:12

标签: java nullpointerexception osx-mountain-lion derby

我正在尝试从java书籍中进行练习。代码按原样出现,除了设置数据库的路径之外,我还没有在代码中添加任何内容。我在OSX上,所以我不得不安装Apache Derby。每次我构建并运行程序时,我都会得到这个:

Derby has been started.

Product list:
bvbn    Murach's Beginning Visual Basic .NET        $49.50
cshp    Murach's C#                                 $49.50
java    Murach's Beginning Java                     $49.50
jsps    Murach's Java Servlets and JSP              $49.50
mcb2    Murach's Mainframe COBOL                    $59.50
sqls    Murach's SQL for SQL Server                 $49.50
zjcl    Murach's OS/390 and z/OS JCL                $62.50

Exception in thread "main" java.lang.NullPointerException
First product:
at DBTesterApp.printProduct(DBTesterApp.java:117)
at DBTesterApp.printFirstProduct(DBTesterApp.java:66)
at DBTesterApp.main(DBTesterApp.java:16)
  Java Result: 1
  BUILD SUCCESSFUL (total time: 2 seconds)

我很困惑为什么这个异常会继续发生。我似乎没有发现“主要”代码有什么问题(见下文),我觉得我已经尝试了一切。有什么可能导致这个的任何线索?

import java.sql.*;

public class DBTesterApp
{
private static Connection connection = null;

public static void main(String args[])
{
    // get the connection and start the Derby engine
    connection = MurachDB.getConnection();
    if (connection != null)
        System.out.println("Derby has been started.\n");

    // select data from database
    printProducts();
    printFirstProduct();
    printLastProduct();
    printProductByCode("java");

    // modify data in the database
    Product p = new Product("test", "Test Product", 49.50);        
    insertProduct(p);
    printProducts();

    deleteProduct(p);
    printProducts();

    // disconnect from the database
    if (MurachDB.disconnect())
        System.out.println("Derby has been shut down.\n");
}

public static void printProducts()
{
    try (Statement statement = connection.createStatement();
         ResultSet rs = statement.executeQuery("SELECT * FROM Products"))
    {            
        Product p = null;

        System.out.println("Product list:");
        while(rs.next())
        {
            String code = rs.getString("ProductCode");
            String description = rs.getString("Description");
            double price = rs.getDouble("Price");

            p = new Product(code, description, price);

            printProduct(p);
        }
        System.out.println();
    }
    catch(SQLException e)
    {
        e.printStackTrace();  // for debugging
    }
}

public static void printFirstProduct()
{
    Product p = null;

    // add code that prints the record for the first product in the Products table

    System.out.println("First product:");
    printProduct(p);
    System.out.println();
}

public static void printLastProduct()
{
    Product p = null;

    // add code that prints the record for the last product in the Products table

    System.out.println("Last product:");
    printProduct(p);
    System.out.println();
}

public static void printProductByCode(String productCode)
{
    Product p = null;

    // add code that prints the product with the specified code

    System.out.println("Product by code: " + productCode);
    printProduct(p);
    System.out.println();
}

public static void insertProduct(Product p)
{
    System.out.println("Insert test: ");

    // add code that inserts the specified product into the database
    // if a product with the specifed code already exists, display an error message

    printProduct(p);
    System.out.println();
}

private static void deleteProduct(Product p)
{
    System.out.println("Delete test: ");

    // add code that deletes the specified product from the database
    // if a product with the specified code doesn't exist, display an error message

    printProduct(p);
    System.out.println();
}

// use this method to print a Product object on a single line
private static void printProduct(Product p)
{
    String productString =
        StringUtils.padWithSpaces(p.getCode(), 8) +
        StringUtils.padWithSpaces(p.getDescription(), 44) +
        p.getFormattedPrice();

    System.out.println(productString);
 }
}

4 个答案:

答案 0 :(得分:8)

此代码序列将生成NPE,因为Product p尚未实例化:

Product p = null;

System.out.println("First product:");
printProduct(p);

答案 1 :(得分:1)

private static void printProduct(Product p)
{
    String productString =
        StringUtils.padWithSpaces(p.getCode(), 8) + // <-- This guy is angry when the 'p' passed to it is null
        StringUtils.padWithSpaces(p.getDescription(), 44) +
        p.getFormattedPrice();

    System.out.println(productString);
 }
}

然后

public static void printFirstProduct()
{
    Product p = null;

    // add code that prints the record for the first product in the Products table

    System.out.println("First product:");
    printProduct(p); //<--- This 'p' is null when you pass it to it because you never assgin it after setting it to null. 
    System.out.println();
}

答案 2 :(得分:1)

你在这里传递空值

public static void printFirstProduct()
{
   Product p = null;

  // add code that prints the record for the first product in the Products table

   System.out.println("First product:");
   printProduct(p);
   System.out.println();
 }

答案 3 :(得分:0)

另一个可能的弱点:

connection = MurachDB.getConnection();
if (connection != null)
    System.out.println("Derby has been started.\n");

如果connectionnull,则代码仍会继续,之后会尝试调用null上的方法。

我并不是说它现在会引起你的问题,但肯定会在某个时候出现。