我正在使用的教科书中遇到一个例子。我是一个绝对的初学者,所以不要完全理解类和静态方法,所以认为问题可能在那里,但是会喜欢任何人都可以提供的清晰度或重定向。
无论如何,我正在写一个数学游戏,它将两个数字相乘(int partA和partB)并要求你给出结果。我遇到的问题是,当我使用代码行example.setText(“”+ partA)将部分A的值放到android设备显示器上时,我得到一个连接错误,尽管它是教科书所说的使用。为了避免这种情况,我已经部署了一个字符串,我希望使用此代码做同样的事情 textObjectPartA.setText(stringPartA.valueOf(A部分)); 但是这会产生一个全新的错误 通过实例引用访问的静态成员'java.lang.String.valueOf(int)'更少... 通过类实例而不是类本身显示对静态方法和字段的引用。 任何人都可以给我一个如何让这个工作的线索。我对其余的代码感到自信,并且因为一些串联的分歧而让应用程序崩溃真的很烦人!
感谢任何帮助,如果您需要查看更多代码,请告诉我哪些位,我会复制并粘贴,
感谢。 NB。 已经阅读了答案,看起来我没有做任何完全错误,所以附上我正在使用的代码,看看是否有人能够发现导致应用程序在加载此脚本时停止工作的错误。我尝试使用和不使用这一块代码运行,所有内容似乎都随之运行并且崩溃了。
/*Now put the variables in the text holes we've created
textObjectPartA.setText(stringPartA.valueOf(partA));
textObjectPartB.setText(stringPartB);
textObjectOperator.setText("x");
//And the answer variables on the buttons
buttonObjectChoice1.setText(stringChoice1);
buttonObjectChoice2.setText(stringChoice2);
buttonObjectChoice3.setText(stringChoice3);
//now we listen for presses of answer buttons
buttonObjectChoice1.setOnClickListener(this);
buttonObjectChoice2.setOnClickListener(this);
buttonObjectChoice3.setOnClickListener(this);
该错误的logcat如下: -
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:113)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
at dalvik.system.NativeStart.main(NativeStart.java:-1)*/
如果有任何进一步的信息有用,请告诉我。
再次感谢,
答案 0 :(得分:1)
你得到的连接警告是因为你试图在setText()
的方法调用中连接你的String,而Android并不喜欢这样,因为它会导致翻译错误。
简单的解决方法是在将String传递给setText()
之前将其连接起来。所以不要这样:
example.setText("" + partA);
您可以执行此操作以删除警告:
String concatString = "" + partA;
example.setText(concatString);
答案 1 :(得分:1)
Android-Studio警告您两个不同的问题。它们都不会使您的应用程序崩溃。
连接问题:
Android-Studio检测到您的消息包含文本部分(""
)和数字部分(partA
),并且您正在连接它们,而不定义字符串资源。
在您的情况下,这是误报,因为连接("" + partA
)的唯一目的是将数字转换为String
。
但是,如果您希望TextView
显示文字“第1部分:数字”,您可能会倾向于这样:example.setText("Part A: " + partA)
。但是,这并不完全正确,因为这对多语言支持并不好。
在这种情况下,您应该在strings.xml
文件中定义资源字符串,如下所示:
<string name="part_a">Part A: %d</string>
请注意%d
是您的号码的占位符,然后您应该通过调用Context#getString(int, Object...)
或Resources#getString(int, Object...)
来引用该资源字符串。
在您的情况下,假设您是从Activity
调用它,您应该这样做:
example.setText(getString(R.string.part_a, partA))
静态问题:
在Java中,类可以定义static
方法。
static
方法在Class
的所有实例之间共享,并且不依赖于Class
的任何单个实例。
由于结果不会因实例而改变,因此无法直接从中调用方法。
因此,使用您的示例,调用stringPartA.valueOf(partA)
会产生与调用stringPartB.valueOf(partA)
完全相同的结果,因为valueOf()
是static
的{{1}}方法类。
从这个意义上讲,调用String
更为正确。
答案 2 :(得分:0)
首先是一个小背景,valueOf
方法是静态方法,意味着它应该从静态引用访问,即直接使用类名而不是它的实例(对象)。因此,有效声明应为String.valueOf(partA)
而不是stringPartA.valueOf(partA)
如果您想以第一种方式连接,请在连接之前使用Integer.toString(partA)。
答案 3 :(得分:0)
example.setText("" + partA)
没问题。
textObjectPartA.setText(stringPartA.valueOf(partA))
也可以。
但textObjectPartA.setText(String.valueOf(partA))
更好。
他们只是警告,而不是错误。
静态方法意味着:
如下所示:
public class A{
public static void doA(){
}
}
您可以使用new A().doA()
。
你也可以直接使用A.doA()
。它更好,因为你不需要创建A的实例。
我的情况是,stringP是String的一个实例。
stringP.valueOf()
与String.valueOf()
相同。