【问题标题】:Java Run Error on code that works有效代码上的 Java 运行错误
【发布时间】:2016-09-30 21:14:55
【问题描述】:

我正在运行一个代码,该代码采用一个整数列表和一个字符串列表,并分别将数组的大小增加到适当的大小,然后以不同的方法对数组进行排序,同时还找到一个重复。在我运行对数组进行排序并查找重复项的方法之前,代码都很好。我知道正确的输出应该是什么,并且在 intList 中不应该找到重复项,并且在索引 45788 处的 wordList 中不应该找到重复项。我已经向其他人寻求帮助,执行同样的简单任务,并且具有与他们相同的代码。我必须离开某个地方,但我找不到在哪里。我在命令提示符的输出旁边附上了这两种方法的照片。感谢您的帮助

import java.io.*;
import java.util.*;

public class Lab4
{
    static final int INITIAL_CAPACITY = 10;
    static final int NOT_FOUND = -1; // indexOfFirstDupe returns this value if no dupes found

    public static void main (String[] args) throws Exception
    {
        // ALWAYS TEST FIRST TO VERIFY USER PUT REQUIRED INPUT FILE NAME ON THE COMMAND LINE
        if (args.length < 1 )
        {
            System.out.println("\nusage: C:\\> java Lab4 <numbers file> <words filename>\n\n"); // i.e. C:\> java Lab4 10000ints.txt 172822words.txt
            System.exit(0);
        }

        String[] wordList = new String[INITIAL_CAPACITY];
        int[] intList  =  new int[INITIAL_CAPACITY];
        int wordCount = 0, intCount=0;
        Scanner intFile = new Scanner( new File(args[0]) );
        BufferedReader wordFile = new BufferedReader( new FileReader(args[1]) );

        // P R O C E S S   I N T   F I L E 
        while ( intFile.hasNextInt() ) // i.e. while there are more ints in the file
        {   
            if ( intCount == intList.length ) 
                intList = upSizeArr( intList );
            intList[intCount++] = intFile.nextInt();

        } //END WHILE intFile

        //close intfile
        intFile.close(); 

        //output text with variables
        System.out.format( "%s loaded into intList array. size=%d, count=%d\n",args[0],intList.length,intCount );

        int dupeIndex = indexOfFirstDupe( intList, intCount );

        if ( dupeIndex == NOT_FOUND )
        {
            System.out.format("No duplicate values found in intList\n");
        }
        else
        {
            System.out.format("First duplicate value in intList found at index %d\n",dupeIndex);
        }

        // P R O C E S S   S T R I N G    F I L E
        while ( wordFile.ready() ) // i.e. while there is another line (word) in the file
        {   
            if ( wordCount == wordList.length ) 
                wordList = upSizeArr( wordList );
            wordList[wordCount++] = wordFile.readLine();
        } //END WHILE wordFile

        //closing wordfile
        wordFile.close(); 

        //output text again with variables
        System.out.format( "%s loaded into word array. size=%d, count=%d\n",args[1],wordList.length,wordCount );

        dupeIndex = indexOfFirstDupe( wordList, wordCount );

        if ( dupeIndex == NOT_FOUND )
        {
            System.out.format("No duplicate values found in wordList\n");
        }
        else
        {
            System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex);

        }
    }

    // --------------------------------------------------------------------------------------------------------------------------------

    // method to double size of string array 

    static String[] upSizeArr( String[] fullArr )
    {
        int length = fullArr.length;

        //creating a new array of double size
        String[] upsizearr = new String[length*2];

            //this for loop assigns each old variable in fullArr
            //and assigns it to the new larger array, upsizearr
            for(int i = 0; i<length-1; i++)
            {
                upsizearr[i] = fullArr[i];
            }

        return upsizearr; 
    }


    // method to double size of int array 

    static int[] upSizeArr( int[] fullArr )
    {
        int length = fullArr.length;

        //creating new array of double size
        int[] upsizearr = new int[length*2];

            //this loop does the same as in upSizeArr method, 
            //assigning all values to new bigger array
            for(int i = 0; i<length-1; i++)
            {
                upsizearr[i] = fullArr[i];
            }

        return upsizearr; 
    }


    // use Arrays.sort() before scanning for dupe
    static int indexOfFirstDupe( int[] arr, int count )
    {       
        Arrays.sort(arr);
        int value = NOT_FOUND;

        for(int i = (arr.length - count); i < count; i++)
        {
            if(arr[i] == arr[i-1])
            {
                value = i;
                break;
            }
        }

        return value;
    }


    // use Array.sort() before scanning for dupe
    static int indexOfFirstDupe( String[] arr, int count )
    {       

        Arrays.sort(arr);
        int value = NOT_FOUND;

        for(int i = (arr.length - count); i < count; i++)
        {
            if(arr[i] == arr[i-1])
            {
                value = i;
                break;
            }
        }

        return value;   
    }

} // END CLASS

[] []2

【问题讨论】:

  • 如果它“运行错误”它不能是“有效的代码”,反之亦然
  • 将您的代码添加到问题中而不是图片中。
  • 您显示了异常(在图片中而不是复制和粘贴),然后甚至没有显示它所引用的行(第 144 行,在 indexOfFirstDupe 内)...
  • @TimeToCode 和 jonhopkins,我的错。我认为我的屏幕截图比它捕获的更多。我粘贴了我的代码。

标签: java arrays sorting javac


【解决方案1】:

修改后的答案:

在仔细研究之后。看来 Arrays.sort() 是罪魁祸首。一种可能性是通过“upSizeArr”增加数组大小的方式。或者 wordFile.readLine() 在将单词添加到 wordList 数组时返回空值。不管是什么原因,“countRunAndMakeAscending”错误主要是由于要排序的数组中的空值。

其他人也遇到过这个问题:

Sorting an array of strings in Java

建议使用 ArrayList。

或者,在排序之前循环遍历数组并将任何空值设置为非空值可以解决此问题。但是,在“indexOfFirstDupe”方法中检查欺骗时,您必须确定一个不会破坏数据集的良好非空值候选。

因此,学习使用 ArrayList 可能是更容易的途径。

留下旧的解决方案,因为它解决了代码中的一个单独问题。

旧答案:

看起来您的代码在遍历单词列表数组时遇到了一个空值。在查看您的代码时,似乎问题也可能存在于 int 列表中。所以......有几件事要纠正。通过在 while 循环中最后递增 intCount 和 wordCount 变量来更改将整数和单词设置为数组的方式。

将整数加载到 intList 时...

// P R O C E S S   I N T   F I L E 
    while ( intFile.hasNextInt() ) // i.e. while there are more ints in the file
    {   
        if ( intCount == intList.length ) 
            intList = upSizeArr( intList );
        intList[intCount] = intFile.nextInt();
        intCount++;
    } //END WHILE intFile

将单词加载到单词列表时

    // P R O C E S S   S T R I N G    F I L E
    while ( wordFile.ready() ) // i.e. while there is another line (word) in the file
    {   
        if ( wordCount == wordList.length ) 
            wordList = upSizeArr( wordList );
        wordList[wordCount] = wordFile.readLine();
        wordCount++;
    } //END WHILE wordFile

【讨论】:

  • 我试过了,现在出现“countRunAndMakeAscending”错误。之前引用的相同行仍然被再次引用
  • 这就是软件编程的故事,您修复了一个错误,然后转到下一个错误……没有太多上下文,很难帮助您。即请在此线程中发布其他人要求的更多信息。
  • 如果我的帖子回答了您的原始帖子,请标记为答案...谢谢! :)
  • 我已经粘贴了全部代码。不知道最近有没有问到什么更多的信息。
  • 再次,只是在这里猜测,因为我无法确认您的代码中的行号是什么。但是您遇到的错误也可能来自 Arrays.sort() 调用。 stackoverflow.com/questions/24175145/… 可能会解释新的 NullPointerException。因此,遍历数组并在排序之前删除任何空值可能会解决“countRunAndMakeAscending”错误。
【解决方案2】:

控制台告诉我们错误发生在 Arrays.sort() 上的 indexOfFirstDupe() 中。您有两个具有此名称的方法,但由于此行运行良好,我们知道错误发生在它之后:System.out.format( "%s loaded into word array. size=%d, count=%d\n",args[1],wordList.length,wordCount );

所以indexOfFirstDupe( String[] arr, int count )中发生了错误

我看到你已经导入了java.util.*,所以Arrays.sort() 应该可用并且不会导致错误。我猜'arr'是空的。尝试在带有Arrays.sort(arr) 的行之前使用System.out.println()arr 打印到控制台。如果它为空,那是你的问题。

【讨论】:

    【解决方案3】:

    如何解读异常:

    线程“主”java.lang.NullPointerException 中的异常

    对于初学者来说,这一行唯一重要的部分是最后一部分(java.lang.NullPointerException),这是您的错误类型。在这种情况下,您有一个为 null 的对象,并且您尝试在该 null 对象上调用方法。

    在……

    在……

    在 Lab4.IndexOfFirsDupe(Lab4.java:144)

    在 Lab4.main(Lab4.java:66)

    这就是所谓的堆栈跟踪。它告诉您代码中的错误在哪里。

    条目由三个重要信息组成:类(lab4)、方法(IndexOfFirstDupe)和代码中的行(第144行)

    编辑:我在添加代码之前写了这个评论

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多