小编Tof*_*eer的帖子

针对已检查异常的案例

多年来,我一直无法得到以下问题的正确答案:为什么一些开发人员如此反对已检查的异常?我有很多对话,在博客上阅读,阅读Bruce Eckel所说的内容(我看到的第一个人反对他们).

我目前正在编写一些新代码,并非常注意我如何处理异常.我试图看到"我们不喜欢被检查的例外"人群的观点,我仍然看不到它.

每次谈话结束时,同样的问题都没有得到答复......让我把它设置起来:

一般来说(从Java的设计方式来看),

  • 对于永远不应该捕获的东西是错误的(VM有花生过敏而且有人丢了一罐花生)
  • RuntimeException用于程序员做错的事情(程序员走出数组的末尾)
  • 异常(RuntimeException除外)适用于程序员无法控制的内容(在写入文件系统时磁盘已填满,已达到进程的文件句柄限制,您无法再打开任何文件)
  • Throwable只是所有异常类型的父级.

我听到的一个常见论点是,如果发生异常,那么开发人员将要做的就是退出该程序.

我听到的另一个常见论点是,经过检查的异常会使重构代码变得更加困难.

对于"我将要做的就是退出"这个论点,我说即使你要退出,你也需要显示一个合理的错误信息.如果您只是在处理错误,那么当程序退出而没有明确说明原因时,您的用户将不会过于高兴.

对于"它很难重构"的人群,这表明没有选择适当的抽象级别.而不是声明方法抛出IOException,IOException应该转换为更适合正在发生的事件的异常.

我没有使用catch(Exception)包装Main的问题(或者在某些情况下catch(Throwable)以确保程序可以正常退出 - 但我总是捕获我需要的特定异常.这样做允许我,至少,显示适当的错误消息.

人们从不回复的问题是:

如果你抛出RuntimeException子类而不是Exception子类,那么你怎么知道你应该捕获什么?

如果答案是捕获异常,那么您也会以与系统异常相同的方式处理程序员错误.这对我来说似乎不对.

如果您捕获Throwable,那么您将以相同的方式处理系统异常和VM错误(等).这对我来说似乎不对.

如果答案是你只捕获你知道的异常,那么你怎么知道抛出的是什么?当程序员X抛出一个新的异常并忘记捕获它时会发生什么?这对我来说似乎非常危险.

我会说显示堆栈跟踪的程序是错误的.那些不喜欢检查异常的人是不是觉得那样?

那么,如果您不喜欢已检查的异常,您可以解释为什么不能并且回答那些无法解答的问题吗?

编辑:我不是在寻找何时使用任何一个模型的建议,我正在寻找的是为什么人们从RuntimeException扩展,因为他们不喜欢从Exception扩展和/或为什么他们捕获异常然后重新抛出RuntimeException而不是将抛出添加到他们的方法中.我想了解不喜欢检查异常的动机.

java exception checked-exceptions

437
推荐指数
21
解决办法
5万
查看次数

适合7岁的环境

我7岁想学习,如何编程?(他的想法不是我的,而且他在外面做事.所以,从这个角度来看,我并不是太担心.他已经把我的办公室里的游戏编程书带到了睡觉时间. )前几天我们坐下来写了一个非常简单的数字猜谜游戏(你选8,这是​​正确的,其他任何错误).

它没问题,但他根据语言的语法提出了许多问题.(我碰巧选择了Java,因为我当时打开了IDE.)我教授高等教育入门编程课程,所以这对我来说有点大开眼界(大多数高中毕业生都不愿意提问)我真的不得不弄清楚,如何解释一个7岁的语法?

显然,任何C类型的语言都会遇到同样的问题,就像大多数"语言"一样.我看着吱吱声,但决定不再使用它.我看了Alice的环境,但也不喜欢它.

从物理角度来看,他对键盘/鼠标感到舒服,并且可以相对轻松地将乐高套装放在一起(因此,按照有趣的结果跟随方向可以为他工作).我可以访问Lego NXT,但他仍然有点年轻(即使使用提供的图形环境,也需要很长时间才能看到工作结果).

理想情况下,我希望有这样的经验来帮助他建立对数学和逻辑的信心(如果一个7岁的孩子有逻辑:-).

我记得小时候使用龟图形/徽标.我倾向于此,但想知道是否有任何其他想法,或者是否有人可以推荐一个良好的徽标环境?

编辑1:

徽标效果很好.我需要教他角度的概念(90度,180度).不幸的是,他们并没有真正在学校做分工,所以角度可能很有趣......

首先画一个正方形:

FORWARD 50
RIGHT 90
FORWARD 50
RIGHT 90
FORWARD 50
RIGHT 90
FORWARD 50
RIGHT 90
Run Code Online (Sandbox Code Playgroud)

稍后我会进入循环:

REPEAT 4 
[
    FORWARD 50
    RIGHT 90
]
Run Code Online (Sandbox Code Playgroud)

然后是变量:

make "length 50

REPEAT 4 
[
    FORWARD :length
    RIGHT 90
]
Run Code Online (Sandbox Code Playgroud)

这非常好.几乎没有语法,一个7岁的孩子很容易记住词汇,并立即反馈.

编辑2:

嗯,这是成功的,因为当我离开房间时,他能够编写一个简单的程序(没有循环).它实际上效果非常好 - 我们出去拿到了方格纸和量角器,我们将90度角度弄出来,然后他制作了一堆正方形,将一个正方形变成了一个矩形,并且看到了他出错的地方.如何调试它.对于对编程感兴趣的7岁的人,我推荐这种方法.我想我也会推荐给我的大专学生(!)

children

42
推荐指数
8
解决办法
3101
查看次数

close是否会抛出IOException?

在这里提供了一些答案并阅读了一些注释后,似乎实际上IOException永远不会在文件I/O上关闭.

是否有任何情况下,在Stream/Reader/Writer上调用close实际上会抛出IOException?

如果实际抛出异常,应如何处理?

java ioexception

28
推荐指数
4
解决办法
9642
查看次数

如何解决jackson中属性的冲突getter定义

我有一些模特课.

public interface Product extends Serializable {
    public Sku getDefaultSku();

   public void setDefaultSku(Sku defaultSku);
}

public interface Sku extends Serializable {
     public Boolean isTaxable();

    public Boolean getTaxable();

    public void setTaxable(Boolean taxable);
}

public interface PremiumProduct extends Product {
   public Long getProductCode();

   public void setProductCode(Long productCode);
}
Run Code Online (Sandbox Code Playgroud)

无法修改Product和Sku实现.我只从产品延伸.之后,我从spring MVC控制器传输JSON对象.我的控制器方法是

@RequestMapping(value="/productDetail", method=RequestMethod.GET)
    public @ResponseBody Product getCustomerName(@RequestParam String productUrl) throws Exception {

      Product product = catalogService.findProductByURI(productUrl);      

                return product;
    }
Run Code Online (Sandbox Code Playgroud)

我有以下例外情况.

<h2>HTTP ERROR 500</h2>
<p>Problem accessing /productDetail. Reason:
<pre>    Conflicting getter definitions for property …
Run Code Online (Sandbox Code Playgroud)

spring json jackson

14
推荐指数
3
解决办法
3万
查看次数

是否有类似于iOS的identifierForVendor for android?

在iOS 6中,[UIDevice currentDevice] .identifierForVendor为来自单个供应商的所有应用程序提供唯一ID.

有没有办法在Android中做同样的事情?

android uniqueidentifier

12
推荐指数
1
解决办法
4882
查看次数

如何将控制台输入传递给正在运行的Java程序而不是jdb?

使用Java的jdb调试我的代码.我停留在我的程序期望命令行输入的位置,但是jdb将其作为jdb命令拦截.

如何告诉jdb将文本传递给正在运行的程序?

版:

C:\Documents and Settings\*snip*>java -showversion
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)

编译:

javac -g LZWDecompress.java
Run Code Online (Sandbox Code Playgroud)

jdb.ini:

stop in LZWDecompress.decompress
run
monitor list
Run Code Online (Sandbox Code Playgroud)

这是发生的事情:

Initializing jdb ...
*** Reading commands from C:\Documents and Settings\*snip*\jdb.ini
Deferring breakpoint LZWDecompress.decompress.
It will be set after the class is loaded.
> run LZWDecompress
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
> > >
VM Started: Set deferred breakpoint LZWDecompress.decompress
File to …
Run Code Online (Sandbox Code Playgroud)

java debugging jdb

10
推荐指数
1
解决办法
5313
查看次数

Killer Apps架构描述

几周前,我的一位朋友向我展示了一个网站,其中解释和描述了最受欢迎网站的架构(youtube,amazon,facebook),它还展示了一些关于它们的有趣统计数据.

有谁知道我在哪里可以找到这些信息?

architecture

8
推荐指数
1
解决办法
337
查看次数

JPA原子查询/保存多线程应用程序

我正在改变我的JP​​A代码以利用线程.我为每个线程都有一个单独的实体管理器和事务.

我曾经拥有(针对单线程环境)的代码如下:

// get object from the entity manager
X x = getObjectX(jpaQuery);

if(x == null)
{
    x = new X();
    x.setVariable(foo);
    entityManager.persist(x);
}
Run Code Online (Sandbox Code Playgroud)

使用多线程环境中的代码我得到重复键,因为我认为,getObjectX为一个线程返回null,然后该线程被换出,下一个线程调用getObjextX,也变为null,然后两个线程将创建并持久化一个新的X().

如果没有同步添加,是否有一种原子方法来获取/保存 - 如果不存在JPA的值或者我应该重新考虑我的方法

编辑:

我正在使用最新的Eclipselink和MySql 5.1

编辑2:

我添加了同步... MASSIVE性能命中(到了无法使用的程度).要在主线程上收集所有数据,然后在该线程上进行创建.

java jpa

8
推荐指数
1
解决办法
3293
查看次数

Java将数组转换为参数

有没有办法将数组转换为参数列表..?

main(){
   //"a" is an array or a list or some collection
   myPrint(a.SomeMethod);
}

void myPrint(int a){
//Do Stuff to arguments
}

void myPrint(int a, int b){
//Do Stuff to arguments
}

void myPrint(int a, int b, int c){
//Do Stuff to arguments
}
Run Code Online (Sandbox Code Playgroud)

我想将"a"转换为参数/参数列表,以便它自动调用相应的函数.

java parameters

8
推荐指数
1
解决办法
6013
查看次数

用于搜索字符串的更快的数据结构

我有这个代码,用于确定单词(忽略大小写)是否包含在wordList文本文件中.但是,wordList文本文件可能有65000 ++行,并且只使用我的实现在下面搜索单词需要将近一分钟.你能想到更好的实施吗?

谢谢!

import java.io.*;
import java.util.*;

public class WordSearch 
{
    LinkedList<String> lxx;
    FileReader fxx;
    BufferedReader bxx;

    public WordSearch(String wordlist) 
        throws IOException
    {
        fxx = new FileReader(wordlist);
        bxx = new BufferedReader(fxx);
        lxx = new LinkedList<String>();
        String word;

        while ( (word = bxx.readLine()) != null) 
            {
            lxx.add(word);
        }

        bxx.close();
    }

    public boolean inTheList (String theWord)
    {
        for(int i =0 ; i < lxx.size(); i++)
            {
            if (theWord.compareToIgnoreCase(lxx.get(i)) == 0)
                    {
                return true;
            }
        }

        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

java data-structures

8
推荐指数
1
解决办法
1万
查看次数