声纳正在提高"改变这种情况,以便它不总是评估为真"以下代码。我咨询了多个人,他们都认为这是误报我们错过了什么?
searchRequest != null
package co.intrasoft.quin_1;
import android.support.v4.app.Fragment;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
public class HomeActivity extends AppCompatActivity {
BottomNavigationView bottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
bottomNavigationView = findViewById(R.id.navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()){
case R.id.action_category:
selectedFragment = CategoryFragment.newInstance();
break;
case R.id.action_ranking:
selectedFragment = RankingFragment.newInstance();
break;
case R.id.action_study:
selectedFragment = StudyFragment.newInstance();
break;
case R.id.action_profile:
selectedFragment = ProfileFragment.newInstance();
break;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout,selectedFragment);
transaction.commit();
return true;
}
});
setDefaultFragment();
}
private void setDefaultFragment() {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout,CategoryFragment.newInstance());
transaction.commit();
}
}
处的通用catch块中出现错误。
但是如果searchRequest为null,则try块中的第一行将抛出NullPointerException,如果我在catch块中没有检查null,它将在我的catch块中再次中断。让我的方法再次失败,这是我不想要的。
编辑:
正如评论中的一些人要求重现错误的代码我已经将它上传到https://github.com/shariqislam786/test的github,这个问题也可以在eclipse中用声纳lint 3.4重现。
答案 0 :(得分:1)
SonarJava分析器(5.1.1)的符号执行引擎引发了一个问题,因为它假设到达catch
块的唯一方法是至少让searchRequest
为非null
。这是发动机的限制,目前尚未涵盖这些情况。以下故障单跟踪此限制:SONARJAVA-2669
现在,正如您所说,没有什么可以阻止您使用参数null
调用该方法。在这种情况下,NullPointerException
将被抛出,实际上,我们将catch (Exception e)
阻止,searchRequest
为null
。
SonarJava因此提出误报。
现在,关于你的实现选择,我相信处理null
这样的情况(通过依赖抛出的异常)并不是人们通常所期望的。输入方法时的明确null
- 检查通常更清晰,应该是首选。
请注意,作为一种良好做法,我认为使用searchRequest
或某些类似的 nullness 注释来注释方法的@javax.annotation.Nullable
参数会更加清晰(这一个)来自JSR-305)。这将有助于其他开发人员(和SonarJava引擎)了解您可以提供参数的状态,并使其清晰明了。