例如:
int value = Int32.MaxValue;
unchecked
{
value += 1;
}
Run Code Online (Sandbox Code Playgroud)
这有什么用?你能想到吗?
我有一个带有过渡文档类型的xhtml页面,其中有一个复选框,我想在加载后取消选中.没有JavaScript!在Firefox 3.5中(例如,可能有其他浏览器)用户可以检查输入,而不是重新加载页面并检查输入.我怎样才能克服这种行为?
我有一个使用jstl和Struts 1标签的遗留webapp.当我使用Java 5/6预编译JSP文件时,jstl和Struts 1标签会抛出有关"未检查或不安全操作"的警告.例如,如果我使用以下标记:
<%@ page import="/anotherpage.inc" %>
Run Code Online (Sandbox Code Playgroud)
抛出以下警告:
Run Code Online (Sandbox Code Playgroud)[javac] Note: Some input files use unchecked or unsafe operations. [javac] Note: Recompile with -Xlint:unchecked for details.
如果我使用-Xlint重新编译:unchecked,我会获得有关违规JSP标记库的内部工作的详细信息.我想压制所有未经检查的操作警告.我认为使用-Xlint:-unchecked会抑制警告,但事实并非如此.
在编译JSP页面时如何禁止这些警告?重新编写JSP标记库或更新一千个JSP页面是不切实际的.我正在寻找一个编译器标志来全局禁用警告,所以我可以看到除了未经检查的警告之外的所有警告.谢谢!
为什么代码替代(1)编译时没有警告,代码替代(2)产生"未经检查的强制转换"警告?
两者共同:
class Foo<T> {
Foo( T [] arg ) {
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(1):
class Bar<T> extends Foo<T> {
protected static final Object [] EMPTY_ARRAY = {};
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(2):
class Bar<T> extends Foo<T> {
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
protected static final Object [] EMPTY_ARRAY = {};
}
Run Code Online (Sandbox Code Playgroud)
备选方案(2)产生:
javac -Xlint:unchecked Foo.java Bar.java
Bar.java:4: warning: [unchecked] unchecked cast
super( (T []) EMPTY_ARRAY );
^
required: T[]
found: …Run Code Online (Sandbox Code Playgroud) 有没有人能够解释我这种奇怪的行为?
int i = 0x1234;
byte b1 = (byte)i;
byte b2 = (byte)0x1234; //error: const value '4660' can't convert to byte (use unchecked)
byte b3 = unchecked((byte)0x1234);
byte b4 = checked((byte)i); //throws
byte b5 = (byte)(int)0x1234; //error: same as above
Run Code Online (Sandbox Code Playgroud)
注意:它是一个空的控制台应用程序,没有启用算术检查(默认情况下).提前谢谢大家.
编辑:我应该足够清楚,但不是所有人.
我知道一个单词不能适合一个字节.但是,默认情况下,C#程序允许某些"危险"操作,主要是出于性能原因.
类似地,我可以将两个大整数相加并且根本没有溢出.
我的奇怪是关于上面的编译时错误:编译b1强制转换/赋值,b2无法编译.显然没有区别,因为两者都是Int32具有相同的值.
希望现在很清楚.
当开发人员与非通用API交互时,他们通常会遇到"未经检查"的警告.请考虑以下示例:
import java.util.AbstractList;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class IterableNodeList<T extends Node> extends AbstractList<T>
{
private NodeList list;
public IterableNodeList(NodeList list)
{
this.list = list;
}
public T get(int index)
{
return (T)this.list.item(index);
}
public int size()
{
return this.list.getLength();
}
}
Run Code Online (Sandbox Code Playgroud)
当然,人们可以投入努力以这样的方式编写它,即没有警告:T在类和构造函数参数上使用类型参数Class<T>,匹配成员变量和cast()调用.
或者,可以考虑简单地编辑IDE配置和构建脚本(例如Maven POM)以完全禁用此编译器警告.现在,如果我们这样做,代码可以保持原样,但我确信做必须有缺点.但是,我想不出任何合理,现实的例子
@SuppressWarnings这里,无论如何没有其他选择",以及在哪里你能想到这样的例子或者说出为什么在全球范围内禁用这些"未经检查"的警告是个坏主意的另一个原因吗?或者这实际上是个好主意?
之前的例子实际上没有引发警告.现在有些答案不再有意义了.抱歉给你带来不便.
我有一个项目,我想默认检查算术,除了一个性能敏感点.不幸的是,VB.Net没有"未经检查"的块.
理想情况下,框架会有一些带有显式未经检查算术的整数类型,但我没有找到类似的东西.我确实发现表达式树具有用于未经检查的操作的二进制表达式,但是委托开销取消了未经检查的优势(然后是一些).
目前我在进行算术运算之前将输入转换为UInt64/Int64,然后转换回(使用按位并确保范围内).它比未经检查的算术慢50%(根据分析).
使用未经检查的算术将算术敏感部分移动到项目可能会起作用,但是为它自己提供一个程序集似乎有些过分.
以下代码段评估为零:
int result = unchecked((int)double.MaxValue);
Run Code Online (Sandbox Code Playgroud)
然而,如果你这样做:
double x = double.MaxValue
int result = (int)x;
Run Code Online (Sandbox Code Playgroud)
结果是(你会猜到这个吗?)int.MinValue.仅这个事实就足够了[见下文],但我的印象unchecked是强迫编译器发出代码,假装不知道转换肯定会失败和/或发生某些溢出.换句话说,它应该给出与编译器不知道所涉及的值时相同的结果(假设它是在禁用"检查算术溢出"的情况下编译的)
那么,这里发生了什么?我对unchecked错误的理解是什么?
根据C#/ .NET标准,其中一个结果是"错误的"吗?
编辑:int.MinValue很容易解释:cvttsd2si当溢出但异常被屏蔽时给出0x80000000.这是JIT编译器使用的指令,如反汇编窗口中所示.但这并不能解决问题的任何部分.
根据ECMA 334(C#2规范),unchecked关键字应始终截断,因此在这两种情况下结果应为零:
int result1 = unchecked((int)double.MaxValue);
double x = double.MaxValue;
int result2 = unchecked((int)x);
Run Code Online (Sandbox Code Playgroud)
但它不是,第二个给出int.MinValue.这对我来说仍然像编译器错误.
我知道这个问题一直被问到,但我仍然无法找到真正帮助我的建议.每当列表向下滚动时,都会取消选中该复选框.是的我正在使用布尔数组来存储值,但这仍然无法解决问题.这是我的代码.请为此建议一个解决方案.谢谢.
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ViewHolder holder;
final boolean[] itemChecked=new boolean[30];
LayoutInflater inflater = context.getLayoutInflater();
if(convertView==null)
{
convertView = inflater.inflate(R.layout.custom_list, null);
holder = new ViewHolder();
holder.txtViewTitle = (TextView) convertView.findViewById(R.id.title_text);
holder.txtViewDescription = (TextView) convertView.findViewById(R.id.description_text);
holder.cb=(CheckBox) convertView.findViewById(R.id.cb);
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
itemChecked[position] = isChecked;
if(itemChecked[position])
{
holder.cb.setChecked(true);
}
else
{
holder.cb.setChecked(false);
} …Run Code Online (Sandbox Code Playgroud) 我想实现一个快速哈希函数,它将使用int数据类型并依赖于整数溢出.MSDN说,为了保证溢出不会触发异常,我必须unchecked为该代码使用块.
假设我只在unchecked块中包围该计算.我的代码会因此而出现任何性能或可移植性问题吗?