小编mal*_*rdz的帖子

当x和y都为真时,"x&y"怎么会变错?

语境:

我正在学习C#并且一直在搞乱Pex for fun网站.该站点向您提出重新实施秘密算法的挑战,方法是在站点中键入代码并检查输入和输出在您的实现和秘密实现之间的差异.

问题:

无论如何,我被困在一个名为XAndY的基本代码决斗上.

从名称来看,答案显而易见:

public static bool Puzzle(bool x, bool y) 
{
    return x && y;
}
Run Code Online (Sandbox Code Playgroud)

但是,这是不正确的,Pex告诉我,以下输入产生的结果与秘密实现不同:

输入:

x:true y:true(0x02)

输出:

我的实现:true(0x02)

秘密实施:假

不匹配你的拼图方法产生了错误的结果.

代码:Puzzle(true,PexSafeHelpers.ByteToBoolean((byte)2));

在尝试比较不同类型的true之后出现了很多困惑之后,我意识到Pex正在寻找的实现实际上只是使用了按位AND:

return x & y;
Run Code Online (Sandbox Code Playgroud)

问题:

我认为,出于语义和短路的原因,您应该使用逻辑&&来比较布尔值,但无论如何:

  1. 这是否意味着x & y并且对于所有可能的bool参数x && y最终没有相同的输出?(或者它可能是Pex中的一些东西吗?)
  2. 这是否意味着您可以区分trueC#中不同的bool值?如果是这样,怎么样?

c# boolean pex bitwise-operators logical-operators

20
推荐指数
1
解决办法
2867
查看次数

这个finally子句包含close()调用的原因是什么

我正在学习在线java课程,使用Java编程简介.

在I/O章节中,下面的代码引入了以下语句:

顺便说一句,在本程序结束时,您将在try语句中找到我们的第一个有用的finally子句示例.当计算机执行try语句时,无论如何都保证finally子句中的命令被执行.

该程序位于第11.2.1节的末尾,是一个简单的程序,只读取文件中的一些数字并以相反的顺序写入.

main方法中的相关代码是(data是Reader,result是Writer):

try {
    // Read numbers from the input file, adding them to the ArrayList.        
    while ( data.eof() == false ) {  // Read until end-of-file.
        double inputNumber = data.getlnDouble();
        numbers.add( inputNumber );
    }

    // Output the numbers in reverse order.        
    for (int i = numbers.size()-1; i >= 0; i--)
        result.println(numbers.get(i));

    System.out.println("Done!");        
} catch (IOException e) {
    // Some problem reading the data from the input file.
    System.out.println("Input Error: " + e.getMessage()); …
Run Code Online (Sandbox Code Playgroud)

java exception-handling try-catch-finally

16
推荐指数
3
解决办法
2499
查看次数

神秘(并发/组件绘图?)非常简单的Swing骰子程序中的错误

对于这个糟糕的问题标题感到抱歉,我对这个错误的原因感到困惑,并且不知道该怎么说这个问题.

我正在学习基本的Swing,并从在线书籍Java编程入门中学习这个练习.

我没有按照信中的说明进行操作,而是尝试这样做:

  • 有一个窗口,显示两个骰子的视觉表示
  • 当你点击其中一个骰子时,它'滚动'并显示新值

我的实施:

  • 一个非常基本的JDie对象,它扩展了JPanel
  • 重写paintComponent绘制模具表示的方法
  • 每次改变模具颜色只是为了一个视觉线索
  • 添加了一个监听器,在按下鼠标时"滚动"骰子,然后
    重新绘制

这个bug非常具体:

  1. 运行DieTest主方法
  2. 调整窗口大小以适合两个骰子
  3. 点击第二个模具进行滚动
  4. 现在点击第一个模具进行滚动
  5. 第二个骰子的值会变回其原始值
  6. 如果你调整窗口大小,第二个骰子的值也会改变

如果我点击骰子滚动它们,我调整窗口大小之前,错误将不会出现......

我想我在某个地方犯了一个基本的错误,这个错误只是伪装成这种奇怪的行为.

我试图尽可能地减少代码,只需要花费很长时间就可以解决bug出现时的问题,以及什么时候没有:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class JDie extends JPanel {

    private Color color;
    private int value;

    JDie(){

        value = getValue();
        color = Color.BLACK;

        //add listener
        addMouseListener(new MouseAdapter(){
            @Override
            public void mousePressed(MouseEvent arg0) {
                value = getValue(); //'roll' the die
                repaint();
            }
        });
    }

    /*private helper methods */
    private int getValue(){
        int …
Run Code Online (Sandbox Code Playgroud)

java concurrency swing drawing

6
推荐指数
1
解决办法
350
查看次数

如何通过反射找出方法的可见性?

语境:

我正在尝试学习/练习TDD并决定我需要创建一个不可变的类.

为了测试'immutability invariant'(你能这么说吗?)我想我会通过反射调用类中的所有公共方法,然后检查该类之后是否没有改变.这样我以后不太可能不小心打破不变量.这可能是也可能不是实际/有效的,但我认为这对我来说也是一种反思.

策略:

  • 用途getMethods():

使用getMethods(),我只获得公共接口,但当然这包括所有继承的方法.那么问题是诸如wait()和notify()之类的方法会导致InvocationTargetExceptions,因为我还没有同步等...

  • 用途getDeclaredMethods():

(天真?)假设只有我声明的方法能够破坏类的不变性,我尝试使用getDeclaredMethods().不幸的是,这会调用在类中声明的所有方法,private和public,而不是超类.私人方法显然不相关,因为它们被允许打破不变性.

题:

所以我的问题是,如何才能找出通过getDeclaredMethods()公共获取的方法是否公开,以便我可以通过反射调用它?通过文档看我没有什么东西跳出来......

我可以看到解决这个问题的其他方法,比如特别忽略像wait()等方法,但这看起来比我能处理的更糟糕.

java reflection visibility access-modifiers

4
推荐指数
1
解决办法
2607
查看次数

为什么assertEquals(new Object [] {"abc"},new Object [] {"abc"}); 没有失败?

我正在按照Kent Beck的测试驱动开发示例.

相关章节可在此处在线预览.

肯特写道:

我们可以使用包含两种货币的双元素数组作为关键字吗?Array.equals()是否检查元素是否相等?

public void testArrayEquals() {
   assertEquals(new Object[] {"abc"}, new Object[] {"abc"});
}
Run Code Online (Sandbox Code Playgroud)

不.测试失败,因此我们必须为密钥创建一个真实对象

但是,当我运行测试时它会通过.

我认为assertEquals会检查Array.equals(),它检查相同的对象而不是内容,因此测试会失败,但它不会(至少不适合我).

另一方面:

System.out.println( new Object[]{"abc"}.equals(new Object[]{"abc"}) );
Run Code Online (Sandbox Code Playgroud)

按预期打印错误...

Eclipse告诉我,assertEquals(Object [],Object [])现在已被弃用,但为了理解,为什么现在测试通过了?

java arrays tdd junit equals

3
推荐指数
1
解决办法
184
查看次数