【问题标题】:casting in Java用Java铸造
【发布时间】:2011-07-28 20:29:53
【问题描述】:

我想知道是否有办法将整数数组转换为 java 中的字符数组。我不断收到 nullPointer 异常错误。

这就是我所拥有的……

    private char [] clubsArray; // Will hold the clubsString String as an array 
        private char [] heartsArray;// Will hold the heartsString String as an array
        private char [] spadesArray;// Will hold the spadesString String as an array
        private char [] diamondsArray;// Will hold the diamondsString String as an array
    private int [] intClubsArray; // Holds the character array as number values so I can sort it properly 
        private int [] intHeartsArray; // Holds the character array as number values so I can sort it properly 
        private int [] intSpadesArray; // Holds the character array as number values so I can sort it properly 
        private int [] intDiamondsArray; // Holds the character array as number values so I can sort it properly 


public void cast()
    {
        for (int i = 0; i < clubsArray.length; i++)// A loop that will cast all the clubs into ints 
        {
            intClubsArray[i] = (int) clubsArray[i];
        }
        for (int i = 0; i < heartsArray.length; i++)// A loop that will cast all the hearts into ints 
        {
            intHeartsArray[i] = (int) heartsArray[i];
        }
        for (int i = 0; i < spadesArray.length; i++)// A loop that will cast all the spades into ints 
        {
            intSpadesArray[i] = (int) spadesArray[i];
        }
        for (int i = 0; i < diamondsArray.length; i++)// A loop that will cast all the diamonds into ints 
        {
            intDiamondsArray[i] = (int) diamondsArray[i];
        }
    }

为什么会出现这个错误??可以修吗??我可以投射整个数组吗?而且我不想为变量设置一个特定的大小,因为当它变成一个 int [] 时,我会得到不必要的 0 的空格。

【问题讨论】:

  • 你应该用正确的大小和类型初始化 int 数组。

标签: java arrays types casting


【解决方案1】:

铸造不是导致问题的原因。您必须使用 new 初始化每个数组的大小。代码不会为任何数组分配内存,但在数组上调用方法length 是导致空指针异常的原因。

for (int i = 0; i < clubsArray.length; i++)
                 // ^^^^^^^^^^ Not initialized and is a null pointer
                 // But calling method on it is what the exception is saying.

所以编写一个init 方法,您需要在其中初始化数组,例如 -

clubsArray = new char[5] ;
// ....

【讨论】:

    【解决方案2】:

    clubsArray.length的错误吗?

    如果是这样,那是因为你没有做过类似的事情:

    clubsArray = new char[12];
    

    您也可能无法初始化 intClubsArray 或任何其他数组)

    【讨论】:

      【解决方案3】:

      你有没有初始化你的 int*Array int 数组?你曾经流行过你的 *Array char 数组吗?

      看起来至少有一个是空的,所以当你调用 *Array.length 时你会得到一个 NPE。发布异常的堆栈跟踪可能会有所帮助。

      为了澄清我的观点,当你调用类似的东西时

      clubsArray.length
      

      如果对象 (clubsArray) 为 null,您将获得 NullPointerException

      【讨论】:

        【解决方案4】:

        Java 没有任何内置方法可以按照您想要的方式转换数组。编写一个方法来做到这一点很容易。

        我的猜测是你的问题是初始化数组失败。 Java 没有提供任何方法来使用类型系统来捕获设置为null 的值,这意味着要构建可靠的代码,您必须在运行时留意null。这也是一个烦恼,因为它不一定是那样的(Spec#)。

        本着这种精神,为什么不创建一个方法来优雅地处理空数组,将它们原封不动地传递给它们。 (代码未测试)

        public int[] castArrayIntToChar(char[] toCast){
            if(toCast == null)
                return null;
            int[] casted = new int[toCast.length];
            for(int i = 0; i < toCast.length; i++){
                casted[i] = (int) toCast[i];
            }
            return casted
        }
        

        将它内置到语言中会有一个很大的好处:这是一种可以使用本机代码、向量化和循环展开进行超级优化的东西。这些天来,JVM 相当不错,但是内置功能可以大大提高速度。

        【讨论】:

          【解决方案5】:

          你真正的问题和 NPE 的原因是你没有初始化你的数组;有关详细信息,请参阅其他答案:

          但要回答您实际提出的问题:

          我想知道是否有办法将整数数组转换为 java 中的字符数组。

          没有。在 Java 中没有办法做到这一点。类型系统禁止它,Java 运行时系统不会让你破坏类型安全来这样做。

          您希望做的最好的事情是:

          • 转换从数组中获取的元素值(就像你现在正在做的那样!!),或者
          • 创建所需类型的新数组并使用循环使用原始数组中适当的强制转换值初始化元素。

          (请注意,第二个不等同于强制转换,因为它涉及创建和使用新数组。)

          【讨论】:

            猜你喜欢
            • 2011-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多