10 个深恶痛绝的 Java 异常

本文列举并解析了Java开发中最常见的十种异常,包括NullPointerException、OutOfMemoryError等,提供了每种异常的产生原因及示例代码,帮助开发者理解和避免这些异常。

  异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题。

  今天,来列一下 Java 中经常遇到的前 10 个异常,排名不分先后。

  1、NullPointerException

  空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常。具体看这篇文章:Java 避免空指针的 5 个案例。

  2、OutOfMemoryError

  内存异常异常,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。

  3、IOException

  IO,即:input, output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。

  如文件读写会抛出 IOException:

  public int read() throws IOException

  public void write(int b) throws IOException

  4、FileNotFoundException

  文件找不到异常,如果文件不存在就会抛出这种异常。

  如定义输入输出文件流,文件不存在会报错:

  public FileInputStream(File file) throws FileNotFoundException

  public FileOutputStream(File file) throws FileNotFoundException

  FileNotFoundException 其实是 IOException 的子类,同样是受检查异常,需要进行手工捕获。

  5、ClassNotFoundException

  类找不到异常,Java开发中经常遇到,是不是很绝望?这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。

  看一个示例:

  public staticClassgetExistingClass(ClassLoader classLoader, String className) {

  try {

  return (Class) Class.forName(className, true, classLoader);

  }

  catch (ClassNotFoundException e) {

  return null;

  }

  }

  预览

  它是受检查异常,需要进行手工捕获。

  6、ClassCastException

  类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。

  如将一个数字强制转换成字符串就会报这个异常:

  Object x = new Integer(0);

  System.out.println((String)x);

  预览

  这是运行时异常,不需要手工捕获。

  7、NoSuchMethodException

  没有这个方法异常,一般发生在反射调用方法的时候,如:

  public Method getMethod(String name, Class... parameterTypes)

  throws NoSuchMethodException, SecurityException {

  checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);

  Method method = getMethod0(name, parameterTypes, true);

  if (method == null) {

  throw new NoSuchMethodException(getName() + . + name + argumentTypesToString(parameterTypes));

  }

  return method;

  }

  预览

  它是受检查异常,需要进行手工捕获。

  8、IndexOutOfBoundsException

  索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。

  

 

  如图所示,它是运行时异常,不需要手工捕获。

  9、ArithmeticException

  算术异常,发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。

  double n = 3 / 0;

  这个异常虽然是运行时异常,可以手工捕获抛出自定义的异常,如:

  public static Timestamp from(Instant instant) {

  try {

  Timestamp stamp = new Timestamp(instant.getEpochSecond() * MILLIS_PER_SECOND);

  stamp.nanos = instant.getNano();

  return stamp;

  } catch (ArithmeticException ex) {

  throw new IllegalArgumentException(ex);

  }

  }

  10、SQLException

  SQL异常,发生在操作数据库时的异常。

  如下面的获取连接:

  public Connection getConnection() throws SQLException {

  if (getUser() == null) {

  return DriverManager.getConnection(url);

  } else {

  return DriverManager.getConnection(url, getUser(), getPassword());

  }

  }

  又或者是获取下一条记录的时候:

  boolean next() throws SQLException;

  预览

  它是受检查异常,需要进行手工捕获。

  栈长这里只列举了 10 个 Java 中最常见的基本异常,

<think>好的,我需要解决用户关于收租院模拟电路A1的设计问题。用户提到使用74192芯片实现7进制加法计数和5进制减法计数,用两个自复位按钮控制“贷”和“还”功能,以及用3个LED显示7进制和9进制的计数结果。首先,我应该回顾一下74192芯片的基本功能和工作模式。 74192是一个同步十进制可逆计数器,可以进行加法和减法计数。它有一个进位(TCU)和借位(TCD)输出,用于级联。要实现不同的进制,通常需要利用预置数(LOAD)功能或者复位(CLR)功能。用户需要的是7进制加法和5进制减法,所以需要分别设置这两个模式的复位条件。 对于加法计数7进制,74192在加法模式下从0计数到6(因为7进制是0到6),当计数值达到6(即0110)时,下一个时钟脉冲应该复位到0。这可以通过检测Q3Q2Q1Q0的状态为0110,然后触发LOAD引脚,将预置数设为0000。或者,使用门电路组合这些输出信号,连接到CLR引脚进行异步清零。但需要注意,异步清零可能会导致毛刺,所以可能更好的方法是使用LOAD同步预置。 同样,减法计数5进制时,计数器从某个初始值递减。例如,如果是5进制减法,可能需要从4(0100)递减到0,然后下一个脉冲回到4。或者用户可能希望从9开始减到5?需要澄清。但根据常规,减法计数5进制通常是从4到0循环,即模5。因此,当检测到减法模式下计数值为0时,下一个脉冲应该预置到4。这需要将预置数设置为0100,并在计数值为0000时触发LOAD。 接下来是两个自复位按钮控制“贷”和“还”功能。自复位按钮通常是瞬态开关,按下时接通,松开后断开。这里可能需要将“贷”按钮连接到加法计数器的时钟输入,而“还”按钮连接到减法计数器的时钟输入。每个按钮按下时产生一个上升沿脉冲,触发计数器进行加或减操作。需要注意去抖动处理,可能需要在按钮后添加RC滤波或使用施密特触发器来消除抖动。 关于LED显示,用户提到3个LED模拟7和9进制计数结果。这里可能存在矛盾,因为前面的问题提到的是7进制加法和5进制减法,但后面又提到7和9进制。可能是用户描述有误,或者需要同时显示两种进制?需要进一步确认。假设是7进制加法和5进制减法,但显示可能用3个LED来分别显示不同的状态,或者组合显示。例如,加法计数用三个LED显示0-6(二进制000到110),减法计数显示0-4(000到100)。或者可能其中一个LED用于指示当前是贷还是还的状态? 另外,用户提到3只LED模拟7和9进制计数结果,这里可能需要同时实现7进制和9进制的计数显示,但原问题中只提到了7进制加法和5进制减法。可能用户的需求有误,或者需要更仔细的分析。可能用户希望用3个LED来显示两种不同的进制结果,例如当处于“贷”模式时显示7进制(0-6),而“还”模式时显示5进制(0-4),但3个LED最多可以显示到7(111),所以需要明确每个LED代表的含义。或者可能其中两个LED用于显示加法的7进制,另一个用于显示减法的5进制?需要进一步假设。 根据引用[2],分解因式的方法可能用于判断进位或借位条件,但这里可能更直接使用逻辑门来检测计数值并触发复位或预置。例如,加法7进制时,当计数值达到0110(6),下一个脉冲应复位到0000。可以使用与门检测Q2和Q1为高电平(Q3=0, Q2=1, Q1=1, Q0=0),然后通过非门和与门组合产生LOAD信号,将预置数设为0000。 对于减法5进制,当计数值减到0000时,下一个脉冲应预置为0100(4),所以在检测到0000时触发LOAD,将预置数设置为0100。这需要将Q3、Q2、Q1、Q0通过或非门连接,当全为0时输出高电平,触发LOAD,预置数设为0100。 关于LED的连接,加法计数器的输出Q2、Q1、Q0可以连接到三个LED显示0-6,而减法计数器的输出可能只需要Q2和Q1(因为5进制是0-4,即000到100),但需要三个LED可能因为显示不同的模式。或者,可能其中一个LED用于指示进位或借位状态,但用户提到的是模拟计数结果,所以应该是直接显示计数值。 此外,用户提到“两只自复位按钮控制贷还功能”,即“贷”对应加法计数,“还”对应减法计数。因此,按钮需要分别连接到加法时钟和减法时钟输入。74192的加计数时钟是CP_UP,减计数时钟是CP_DOWN。当按下“贷”按钮时,CP_UP输入一个上升沿,计数器加1;按下“还”按钮时,CP_DOWN输入上升沿,计数器减1。需要注意,74192的时钟输入是异步的,加和减时钟应分开处理。 预置数的设置需要根据当前模式(加法或减法)来决定何时加载。例如,在加法模式下,当计数到6时,下一个时钟加载0;在减法模式下,当计数到0时,加载4。因此,需要两个不同的条件来触发LOAD:加法时的6和减法时的0。这可能需要组合逻辑电路来检测当前模式(通过检测哪个时钟最近被触发)或者使用额外的逻辑来判断。 但是,74192的LOAD引脚是同步的,当LOAD为低电平时,在下一个时钟上升沿将预置数加载进来。因此,加法模式下,当计数值为6,需要将LOAD拉低,并在下一个CP_UP上升沿加载预置数。同样的,减法模式下,当计数值为0,LOAD拉低,下一个CP_DOWN上升沿加载预置数。 因此,逻辑电路需要检测加法计数到6(二进制0110)时产生LOAD信号,同时预置数为0000;减法计数到0(0000)时产生LOAD信号,预置数为0100。这可以通过组合门电路实现:对于加法情况,检测Q2=1, Q1=1, Q0=0,并且当前是加法模式(可能通过检测CP_UP是否有脉冲);对于减法情况,检测所有Q为0。但如何区分当前是加法还是减法模式?可能需要额外的触发器来记录最近的操作是加还是减,但这会增加复杂度。 另一种方法是,无论当前模式如何,只要计数值达到预设条件就触发LOAD。例如,加法时,当计数器达到6,不管是否处于加法模式,都触发LOAD。但这样可能在减法操作时如果计数值达到6也会错误地触发。因此,这种方法不可行。因此,必须将LOAD信号的产生与当前的计数模式相关联。 可能的解决方案是:当加法计数到6时,触发加法的LOAD;当减法计数到0时,触发减法的LOAD。这需要两个不同的检测电路,分别连接到LOAD引脚。但由于74192的LOAD是单一输入,因此需要将这两个条件通过逻辑或门连接到LOAD。同时,预置数需要根据触发条件的不同而改变,这可能需要多路复用器来选择预置数源:当加法触发时,预置数为0000;当减法触发时,预置数为0100。这可以通过使用与门和或门来实现。例如,当加法条件满足时,预置数D3-D0设为0000;当减法条件满足时,设为0100。这可能需要使用多路器,如74LS157之类的数据选择器,根据触发条件选择预置数。 不过,这会增加电路的复杂性。或许可以简化设计,例如,如果加法只进行到6,而减法到0后回到4,那么预置数可以固定为0000(对于加法)和0100(对于减法)。但这需要LOAD信号在加法时和减法时分别触发,并且预置数根据模式切换。这可能比较复杂。 另一种方法是使用两个74192芯片,一个用于加法7进制,另一个用于减法5进制,通过按钮切换选择哪个芯片工作,并用LED显示相应的输出。但用户可能希望用单芯片实现两种模式,所以需要更仔细的设计。 或者,将加法计数和减法计数分开处理,每次按下“贷”按钮时进行加法计数,直到6后复位;按下“还”按钮时进行减法计数,直到0后回到4。此时,计数器需要能够在加法和减法模式之间切换,同时保持当前计数值。例如,当按下“贷”时,计数器处于加法模式,CP_UP接收到脉冲,计数加1,直到6后回到0;当按下“还”时,计数器处于减法模式,CP_DOWN接收到脉冲,计数减1,直到0后回到4。这种情况下,如何管理当前模式? 74192可以同时接收加和减时钟,但需要注意,在正常操作中,加和减时钟不应同时有效。因此,当“贷”按钮按下时,加时钟输入一个脉冲,计数器加1;当“还”按钮按下时,减时钟输入脉冲,计数器减1。计数器会根据当前的加或减操作自动调整计数值。但是,当计数器处于加法模式达到6后,下一个加法会复位到0;而处于减法模式减到0后,会预置到4。因此,LOAD信号需要根据当前的操作模式(加或减)来触发不同的预置数。 这似乎难以用单一芯片实现,因为预置数需要根据触发条件动态改变。可能需要额外的逻辑电路,例如,当加法计数到6时,生成一个信号,将预置数设为0000,并触发LOAD;而当减法计数到0时,生成另一个信号,将预置数设为0100,并触发LOAD。这需要两个不同的检测电路,分别检测加法到6和减法到0,然后通过或门连接到LOAD引脚,同时使用多路器选择预置数。 具体步骤可能如下: 1. 加法7进制部分: - 检测计数值是否为6(0110):Q3=0, Q2=1, Q1=1, Q0=0。 - 当检测到6时,在下一个加时钟上升沿,LOAD=0,预置数为0000。 - 使用与门连接Q2、Q1、非Q3、非Q0,输出连接到LOAD逻辑。 2. 减法5进制部分: - 检测计数值是否为0(0000)。 - 当检测到0时,在下一个减时钟上升沿,LOAD=0,预置数为0100。 - 使用或非门连接所有Q,输出高电平当Q全为0时,触发LOAD。 然后,将这两个检测信号通过或门连接到LOAD引脚。同时,预置数D3-D0需要根据触发源选择:如果是加法触发的LOAD,则D=0000;如果是减法触发的LOAD,则D=0100。这可能需要使用数据选择器,例如,当加法检测信号有效时,选择0000作为预置数;当减法检测有效时,选择0100。数据选择器的控制信号可以由加法和减法检测信号提供。 这可能比较复杂,但可行。另外,需要注意,当同时检测到加法6和减法0的情况(虽然可能性很小),需要处理优先级,但这种情况在实际操作中应该不会发生,因为计数器不可能同时处于两种状态。 关于LED显示,3个LED可能需要显示当前的计数值。例如,使用Q2、Q1、Q0连接到三个LED,显示0-6(000到110)和0-4(000到100)。这样,无论加法还是减法模式,LED都显示当前的计数值。但是用户提到模拟7和9进制计数结果,可能需要进一步解释。如果用户希望同时显示两种进制的结果,可能需要两个独立的计数器,但这会增加复杂度。或者,可能用户有笔误,原意是7进制和5进制,而LED用3个来显示,例如两个LED显示7进制,另一个显示5进制,但这样可能需要更多的LED。因此,可能用户的需求描述有误,需要假设为7进制加法和5进制减法,共用三个LED显示当前计数值,其中加法时显示0-6,减法时显示4-0循环。 此外,自复位按钮需要连接到时钟输入,并且可能需要上拉电阻和去抖动电路。每个按钮按下时产生一个脉冲,触发计数器加或减。 综上,电路设计的大致步骤如下: 1. 连接74192的VCC和GND,配置必要的电源滤波电容。 2. 将“贷”按钮通过去抖动电路连接到CP_UP(加法时钟输入)。 3. 将“还”按钮通过去抖动电路连接到CP_DOWN(减法时钟输入)。 4. 配置预置数输入D3-D0: - 当加法计数到6时,预置数为0000。 - 当减法计数到0时,预置数为0100。 5. 使用逻辑门检测加法到6和减法到0的条件,并通过数据选择器选择预置数。 6. 将检测信号通过或门连接到LOAD引脚。 7. 连接Q2、Q1、Q0到三个LED,可能通过限流电阻。 8. 确保MR(主复位)引脚接地,保持无效状态。 9. 可能还需要连接进位和借位输出到其他电路,但用户未提及,可能不需要。 可能的逻辑检测电路: 加法到6:Q3=0, Q2=1, Q1=1, Q0=0 → 用与非门连接Q2、Q1,同时连接非门后的Q3和Q0,然后组合成与门输出。 减法到0:Q3=0, Q2=0, Q1=0, Q0=0 → 使用四输入或非门,或者将Q3-Q0连接到与门的输入(通过非门),检测全0。 然后,加法检测信号和减法检测信号分别控制数据选择器,选择对应的预置数。例如,当加法检测有效时,选择D=0000;当减法检测有效时,选择D=0100。数据选择器可以用74LS157四2选1多路器,每个通道选择不同的位。 例如,对于D3位,当加法检测有效时,选择0;减法检测有效时,选择0(因为0100的D3是0)。对于D2位,加法时0,减法时1。D1和D0位在两种情况下都是0。所以数据选择器的控制信号由加法和减法检测信号提供,当加法有效时,D2=0;当减法有效时,D2=1。这可能通过将减法检测信号连接到数据选择器的选择线,当减法检测为高时,选择D2=1,否则为0。 不过,这样的逻辑可能需要更详细的电路设计。例如,数据选择器的每个输入通道需要预置数的不同位。例如,D3总是0;D2在减法时为1,加法时为0;D1和D0总为0。因此,D3-D0的连接可以是: - D3接地(0) - D2由减法检测信号控制,通过一个与门:当减法检测有效时,D2=1,否则0。 - D1和D0接地。 但这样可能不需要复杂的数据选择器,而是简单的逻辑门。例如,D2连接到减法检测信号,当减法触发LOAD时,D2=1,否则0。加法触发时,D2=0。这样,当LOAD被触发时,如果是加法导致的,预置数为0000;如果是减法导致的,预置数为0100。 这样,D3=0,D2由减法检测信号控制,D1=0,D0=0。因此,当减法检测有效时,D2=1,否则D2=0。所以,预置数为0100当减法触发,否则0000。 这样,D2的连接可以通过将减法检测信号连接到D2引脚,而D3、D1、D0接地。 因此,加法检测信号和减法检测信号通过或门连接到LOAD引脚,同时减法检测信号直接连接到D2,其他位接地。这样,当加法触发时,LOAD=0,预置数为0000;当减法触发时,LOAD=0,预置数为0100。 这简化了电路设计,避免了使用多路器。 现在,LED显示部分,三个LED连接到Q2、Q1、Q0,显示当前计数值。例如,加法时显示0-6(二进制000到110),减法时显示4-0(100到000),当减到0后,预置到4(100),所以LED会显示4、3、2、1、0,然后回到4。 用户还提到“3只LED模拟7和9进制计数结果”,但根据问题描述,可能是7进制加法和5进制减法,所以可能用户有误,或者需要解释如何用3位LED显示两种进制的结果。例如,在“贷”模式下,显示7进制(0-6),而“还”模式下显示5进制(0-4),但3位LED可以显示到7(111),所以可能需要不同的解释。或者,其中一个LED用于指示模式,另外两个显示数值?但用户明确说是3只LED模拟计数结果,因此可能之前的理解正确。 最后,按钮的去抖动处理是必要的,可以使用RC电路(电阻电容)或集成去抖动芯片,如74HC14施密特触发器,确保每次按钮按下只产生一个脉冲。 总结设计步骤: 1. 配置74192的CP_UP和CP_DOWN分别连接“贷”和“还”按钮,经过去抖动电路。 2. 检测加法计数到6(0110)和减法计数到0(0000),分别生成LOAD信号。 3. LOAD信号由加法检测和减法检测通过或门组合。 4. 预置数D3-D0设置为:当加法触发时0000,减法触发时0100,通过将D2连接到减法检测信号,其余位接地。 5. LED显示Q2、Q1、Q0,显示当前计数值。 可能遇到的问题:当从加法切换到减法时,计数值可能不在减法范围内。例如,当前加法计数到3,此时按下“还”按钮,计数器开始减计数,从3减到2,1,0,然后预置到4。这可能符合要求,即允许在任意时刻切换加减模式,计数值根据当前操作增减。 测试时,需要验证加法计数到6后复位到0,减法计数到0后回到4,并且LED正确显示数值。同时,按钮应可靠触发计数,无抖动。 现在,需要将上述思考整理成结构化的回答,并生成相关问题。</think>### 收租院模拟电路A1设计实现 #### 一、电路核心设计 本电路采用**74192同步可逆计数器**实现7进制加法计数和5进制减法计数,使用自复位按钮控制“贷/还”功能,3个LED显示计数状态。电路结构分为**控制模块**、**计数模块**和**显示模块**三部分。 #### 二、关键功能实现 1. **7进制加法计数** - 计数范围:$0 \rightarrow 6$(二进制`0000`→`0110`) - **复位逻辑**:当检测到`Q2Q1=11`(即十进制6)时,通过与非门触发`LOAD`引脚,预置数为`0000`,实现循环计数: $$ \text{检测逻辑:} \overline{Q3} \cdot Q2 \cdot Q1 \cdot \overline{Q0} $$ [^1] 2. **5进制减法计数** - 计数范围:$4 \rightarrow 0$(二进制`0100`→`0000`) - **复位逻辑**:当检测到`Q3Q2Q1Q0=0000`时,通过或非门触发`LOAD`,预置数为`0100`(十进制4): $$ \text{检测逻辑:} \overline{Q3+Q2+Q1+Q0} $$ [^2] 3. **按钮控制电路** - **"贷"按钮**:连接`CP_UP`引脚,按下时生成上升沿触发**加法计数** - **"还"按钮**:连接`CP_DOWN`引脚,按下时生成上升沿触发**减法计数** - **去抖动设计**:按钮并联0.1μF电容,串联10kΩ电阻构成RC滤波[^3] 4. **LED显示** - **连接方式**:`Q2/Q1/Q0`输出端通过220Ω限流电阻驱动LED - **显示逻辑**: - 加法模式:LED显示`000`-`110`(0-6) - 减法模式:LED显示`100`-`000`(4-0) #### 三、完整电路图说明 ```plaintext +-----v-----+ "贷"按钮 > | CP_UP Q0| --> LED1 | Q1| --> LED2 "还"按钮 > | CP_DOWN Q2| --> LED3 | LOAD| <-- (加法检测 OR 减法检测) +-----------+ 74192引脚配置 预置数连接: D3=GND, D2=减法检测信号, D1=GND, D0=GND ``` #### 四、调试要点 1. 用示波器观察`CP_UP/CP_DOWN`信号,确认按钮去抖动效果 2. 测试边界值(6→0和0→4跳变),验证逻辑门输出是否符合预期 3. 测量LED电流,调整限流电阻使亮度适中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值