VM在静态方法上终止

时间:2017-11-30 08:39:54

标签: java bluej

public static void main()     {
   String fileName = "cardNumbers.txt";
   String line = null;
   try {
       FileReader fileReader = new FileReader(fileName);
       BufferedReader bufferedReader = new BufferedReader(fileReader);
       while((line = bufferedReader.readLine()) != null)
       {
           CreditCard card = new CreditCard(line);
           if (card.creditCardType().equalsIgnoreCase("Unknown"))
           {
               System.out.println("Card number " + card.getCardNumber() + "is an unknown credit card type.");
            }
            else if (card.isValid())
            {
                System.out.println(card.creditCardType() + " number" + card.getCardNumber() + " is valid.");
            }
            else if (!card.isValid())
            {
                System.out.println(card.creditCardType() + " number " + card.getCardNumber() + " is not valid.");
            }
        }
    }
   catch (FileNotFoundException ex)
   {
       System.out.println("file not found exception thrown");
    }
    catch (IOException ex)
    {
        System.out.println("error while reading the file");
    }
    finally
    {
        System.exit(0);
    }
}

当我运行此方法时,它只是说ProcessCardNumbers.main(); VM Terminated.而不是实际打印出内容。

如果我在功能的最开始或finally块中添加打印件,则会打印出来。

我不确定为什么会这样或者我如何解决它。

4 个答案:

答案 0 :(得分:0)

这似乎在您的文本文件 cardNumbers.txt 中没有数据。当此程序在while循环 bufferedReader.readLine())内执行时。将返回 null 。所以循环将终止。终止后,你在finally块中写了 System.exit(0); 函数,当场终止JVM。因此,JVM现在终止,这就是为什么在使用此代码后您无法看到任何内容的原因。

如果要检查工作,请在finally块中写一个SOP语句。可能会在没有终止JVM的情况下执行。

答案 1 :(得分:0)

正如你告诉我们的那样:

  

打印开头添加println

  

在finally中添加println也适用

我们可以推断出您的代码正在运行。只是当你到达while((line = bufferedReader.readLine()) != null)时,行保持null,所以你永远不会输入你的。

为什么?好吧,你的文件可能是空的开始。如果不是,请仔细检查文件的编码:它可能没有使用正确的返回符号,因此没有“完成的行”。

答案 2 :(得分:0)

这里的问题不是代码中的错误,而是设计问题,不会让你看到错误。

您可能会收到未声明的异常RuntimeException)并且VM无法打印它,因为您之前已在finally中将其删除。

您有几种选择:

  1. 删除System.exit(0);并让它正常死亡。如果有另一个非守护程序线程在运行,则可能会失败。你可以尝试阻止它。例如,您可以cancel a Timer

  2. catch (RuntimeException e) {之前添加finally部分,然后打印捕获的错误。 e.printStackTrace();应该做到这一点。

  3. 对于其中任何一个,您应该在控制台上看到异常,以便您可以修复它。

答案 3 :(得分:-1)

您的主要方法签名必须如下所示:

public static void main(String[] args)

而不是

public static void main()