Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查变量是否已初始化_Java - Fatal编程技术网

Java 如何检查变量是否已初始化

Java 如何检查变量是否已初始化,java,Java,首先,我对Java相当陌生,如果这个问题非常简单,那么很抱歉 问题是:我有一个String[]s,它是通过拆分一个字符串生成的,其中每个项目都是一个数字。我想将s的项转换为int[]n s[0]包含n将保存的项目数,有效地s.length-1。我正试图使用foreach循环来实现这一点: int[] n; for(String num: s){ //if(n is not initialized){ n = new int[(int) num]; cont

首先,我对Java相当陌生,如果这个问题非常简单,那么很抱歉

问题是:我有一个
String[]s
,它是通过拆分一个字符串生成的,其中每个项目都是一个数字。我想将
s
的项转换为
int[]n

s[0]
包含
n
将保存的项目数,有效地
s.length-1
。我正试图使用foreach循环来实现这一点:

int[] n;
for(String num: s){
    //if(n is not initialized){
        n = new int[(int) num];
        continue;
    }
    n[n.length] = (int) num;
}
现在,我意识到我可以用这样的东西:

int[] n = new int[(int) s[0]];
for(int i=1; i < s.length; i++){
    n[i-1] = (int) s[i];
}
int[] n = new int[Integer.parseInt(s[0]);
for (int idx = 0; idx < n; ++idx)
  n[idx] = Integer.parseInt(s[idx + 1]);
int[]n=新的int[(int)s[0]];
对于(int i=1;i

但是我相信我将来会面临“如果n未初始化,则初始化它”的问题。

如果在使用变量或对象之前将其初始化为
null

String myVar1 = null;
Person bobby = null;
您可以将变量或对象与not null进行比较

if (myVar != null) {
  // myVar has a value.
}

您可以检查
null

int[] n;
for(String num: s){
    if(n == null) {
        n = new int[(int) num];
    }
    n[n.length] = (int) num;
}

请注意,只有当n是类成员时,才会发生这种情况。如果它是局部变量,编译器将不允许您在未初始化它的情况下对其执行任何操作。

您不能将
字符串
强制转换为
int
。Java是强类型的,没有像脚本语言中那样的隐式类型转换

int[] n = null;
for(String num: s){
    if(n == null){
        n = new int[(int) num];
        continue;
    }
    n[n.length] = (int) num;
}
要将
字符串
转换为
int
,请使用显式转换,如
Integer.parseInt(String)

数组的所有成员变量和元素都使用默认值初始化。对于
int
类型,值为0。对于引用类型(对象的任何子类型)
,默认值为
null
。局部变量不会获得默认值,但编译器会分析代码,以确保在读取变量之前分配值。否则,代码将无法编译

我想你想要的是这样的:

int[] n = new int[(int) s[0]];
for(int i=1; i < s.length; i++){
    n[i-1] = (int) s[i];
}
int[] n = new int[Integer.parseInt(s[0]);
for (int idx = 0; idx < n; ++idx)
  n[idx] = Integer.parseInt(s[idx + 1]);
int[]n=newint[Integer.parseInt(s[0]);
对于(int idx=0;idx
您无法检查代码中的变量是否已初始化,因为根据定义,从可能未初始化的变量读取会导致编译时错误

您可以将变量初始化为
null
并检查该值,前提是您的变量不是基元类型,并且初始化后
null
不是有效值


在特定的示例中,您显示的第二个代码肯定会更干净。

您可能需要查看collections框架中的其他数据结构

->


ArrayList是数组的一个合理的很好的替代品

你唯一能做的就是检查
null
。如果你的代码在一个方法中,如果你不初始化它就不会编译。所以如果它编译并运行,你知道它至少被初始化为
null
,然后做
null
检查。

就像其他人没有做过的那样ed,最接近“正确方法”的方法是将数组初始化为null

关于其他问题:

“n[n.length]”将引发“索引越界”异常。数组的元素范围为0到长度-1。在任何情况下,我认为您在第一种情况下想要说的是“n[0]”,在第二种情况下想要说的是“n[I]”


将数组的大小存储在第一个元素中可能是个坏主意。可以对int数组执行此操作,但在字符串数组中会很混乱,对布尔数组根本不起作用。即使在int情况下,您现在在同一数据结构中混合了两个非常不同的内容,这可能会造成混淆。如果数组大小为fi“长度”仍然保留大小。如果数组大小是可变的,并且您认为要创建一个足够大的数组,然后存储实际使用的数量,那么最好使用ArrayList,它可以干净地处理动态大小数组。

我遇到了这个问题,正在检查
int
是否已初始化。在我的程序中它可能被初始化为
0
,因此检查
是否(inti=0)
没有多大用处


作为一种解决方案/解决方法,我创建了一个
boolean
变量,该变量在
int
初始化时设置。希望这能有所帮助。

只有当它最初显式初始化为null,或者它是一个对象/类成员时,我才编辑了我的答案,我应该更清楚地说明我的方向。关于引用类型的部分应该是“引用类型(对象的任何子类型)”,因为
Object[]
不是
Object
的子类,但它是一个子类型。谢谢,玩了一点之后,我发现我必须做新的整数才能转换它。@Javier:再次说明:这不是“转换”,而是“转换”。@Javier
新整数(字符串)
在大多数情况下都不是一个很好的API。如果您想要一个
Integer
对象,请使用
Integer.valueOf(String)
取而代之。这将最大限度地减少创建的不同对象的数量。在这种情况下,如果您想要一个原语
int
,请使用
parseInt
方法,这样可以避免完全创建
Integer
对象。@erickson非常感谢,这是一个很好的建议!@Joachim感谢您的澄清,我来自动态类型的background,所以我不完全理解其中的区别。这无法编译:默认情况下,局部变量未设置为
null
。(此外,int casting存在问题,无法像@erickson所指出的那样工作)。谢谢。我不知道我可以给任何类型的变量赋值为null。@Javier:只给引用类型的变量/字段赋值。所以除了
int
boolean
char
short
long
float
double
。引用类型包括
Integer
int[]
,以及无数的其他可能性。@多谢您的澄清,所以它永远不会消失