Java Android If-Else故障排除
这是我创建的一个函数 如您所见,这将读取搜索Java Android If-Else故障排除,java,android,if-statement,Java,Android,If Statement,这是我创建的一个函数 如您所见,这将读取搜索文件名的文件,然后读取--温度升高-- 问题不是每个文件名都有--温度升高--和 我尝试使用else语句,但是如果我从else语句中删除中断,对于文件名,如果没有--温度升高--,整个应用程序将崩溃 但是如果我在else语句中添加一个break语句,则每个filename都将运行else语句,即使它们包含--温度升高-- 我还尝试过在没有的情况下执行一个简单的else语句!line.equals(“--TEMPERATURE UP--”但它仍然是一样的
文件名的文件,然后读取--温度升高--
问题不是每个文件名都有--温度升高--
和
我尝试使用else语句,但是如果我从else语句中删除中断
,对于文件名
,如果没有--温度升高--
,整个应用程序将崩溃
但是如果我在else语句中添加一个break
语句,则每个filename
都将运行else语句,即使它们包含--温度升高--
我还尝试过在没有的情况下执行一个简单的else语句!line.equals(“--TEMPERATURE UP--”
但它仍然是一样的
要么我必须在else添加break
以运行else
代码,该代码将不会运行if
代码,要么我删除break
,该代码运行if
代码,但无法运行else
代码,因为它将崩溃
请告知我应该如何更改代码,这样当它读取--温度升高--
时,它将运行if
代码,否则它将运行else
代码
非常感谢
public void tempUp() {
SharedPreferences sharedTest = getSharedPreferences("MySharedTest", Context.MODE_PRIVATE);
String filename = sharedTest.getString("filename", " ");
Log.d("File readed: ", filename);
File dir = new File(path);
File[] files = dir.listFiles();
for (File f : files) {
if (f.isFile()) {
BufferedReader inputStream = null;
try {
inputStream = new BufferedReader(new FileReader(f));
String lineToRead = filename;
String CurrentLine;
while ((CurrentLine = inputStream.readLine()) != null) {
if (CurrentLine.equals(lineToRead)) {
try
{
BufferedReader reader = new BufferedReader(new FileReader(f));
String line = reader.readLine();
while(line !=null)
{
line = reader.readLine();
if(line.equals("--TEMPERATURE UP--"))
{
final String ms = reader.readLine();
Log.d("temp up: ", ms);
new Thread(new Runnable()
{
@Override
public void run()
{
String message = "\u000704NTX" + ms + "\r";
byte[] byte_array = message.getBytes();
try
{
SharedPreferences prefx = getSharedPreferences("Device_Data", Context.MODE_PRIVATE);
String device_ip = prefx.getString("local_ip", " ");
String host = device_ip;
Socket socket = new Socket(host, 8070);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(byte_array);
out.flush();
}
catch (Exception e)
{
}
}
}).start();
break;
}
else if (!line.equals("--TEMPERATURE UP--"))
{
Toast.makeText(TestScreen.this, "There is no Temperature Display for this profile.", Toast.LENGTH_LONG).show();
break;
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
更新:
try
{
BufferedReader reader = new BufferedReader(new FileReader(f));
String line = reader.readLine();
boolean hasTempDisplayProfile = false;
while((line = reader.readLine()) !=null)
{
if(line.equals("--TEMPERATURE UP--")) {
hasTempDisplayProfile = true;
final String ms = reader.readLine();
Log.d("temp up: ", ms);
new Thread(new Runnable() {
@Override
public void run() {
String message = "\u000704NTX" + ms + "\r";
byte[] byte_array = message.getBytes();
try {
SharedPreferences prefx = getSharedPreferences("Device_Data", Context.MODE_PRIVATE);
String device_ip = prefx.getString("local_ip", " ");
String host = device_ip;
Socket socket = new Socket(host, 8070);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(byte_array);
out.flush();
} catch (Exception e) {
}
}
}).start();
break;
}
}
if (hasTempDisplayProfile){
Toast.makeText(TestScreen.this, "There is no Temperature Display for this profile.", Toast.LENGTH_LONG).show();
break;
}
}
catch (IOException e)
{
e.printStackTrace();
}
您当前的实施是:
while(readLine) {
if (line.equal("--TEMPERATURE UP--") {
// process
} else {
// Toast message
}
}
你现在看到问题了吗?问题是您正在为每一行重新测试--温度升高--
,并在每一行不匹配时显示Toast
这是错误的
您需要检查的是,整个文件是否不包含--温度升高--
,如果是,则显示烤面包片
因此,正确的实现将涉及一个标志:
boolean hasTempDisplayProfile = false;
while(readLine) {
if (line.equal("--TEMPERATURE UP--") {
// process
hasTempDisplayProfile = true;
}
}
if (!hasTempDisplayProfile) {
// Toast message
}
编辑
您的代码还有另一个严重缺陷:
String line = reader.readLine();
while(line !=null){
line = reader.readLine();
... your process ...
}
在这段代码中,您读取一行。然后检查中的行不等于null,而。问题是您没有使用该行,而是使用进程读取另一个line=reader.readLine()
。当您到达文件末尾时,它将抛出NullPointerException
更改为:
String line;
while((line = reader.readLine()) !=null){
// Do not read new line here. Just process with "line"
}
顺便说一下,您的代码需要改进。它现在有太多的缩进,这是非常沮丧的阅读。您可以尝试:
将您的函数分解为更小的模块
使用fail fast。如果条件保持为true
,请在false
时尝试返回,而不是包装代码。例如:
for (File f: files) {
if (f.isFile()) {
// Your process
}
}
应改为:
for (File f: files) {
if (!f.isFile()) {
continue;
}
// Your process
}
它减少了一级缩进。请对代码应该执行的操作添加一个清晰的描述。也许您应该打印这行?if语句没有被破坏……无论在什么情况下,while
都会被破坏,那么为什么在while
时会有一个语句呢?如果它读取--温度升高--
,基本上就是一个线程,如果不是,我只想吐司一条消息。就这些@TimBiegeleisenAlso,你为什么要为同一个文件创建两个BufferedReader?您好,您能告诉我在何处中断if-else语句吗?我已将布尔值添加为advice,但每当我尝试运行这些配置文件时,如果没有--温度升高--
,它仍会崩溃,错误指向(line.equal(“--温度升高--”
所以我想我的中断可能是错误的。目前我在if和ELSED上都设置了2个中断中断在if(hasTempDisplayProfile)中是否有任何中断{
?您现在可以捕获代码的屏幕截图并与我共享吗?您好,请刷新页面并检查问题,我已将当前代码添加到更新:
下,请重新阅读我的答案,如果(!hasTempDisplayProfile)请块
放置在之外,而循环。您好,我已根据您编辑的答案进行了更新,并尝试放置if(!hasTempDisplayProfile)在while循环中和在while循环外。两者都有相同的结果。现在发生的情况是,如果文件没有--温度升高--
,则不会发生任何错误,也不会发生任何事情,但是如果文件有--温度升高--
,则它仍会运行进程,但同时在if(!hasTempDisplayProfile)内执行toast操作
同样如此